python中执行shell命令的几个方法,本文一共给出3种方法实现执行shell命令。
其中包括os、subprocess以及commands三个模块下对shell命令的执行,三种方法都可以完成命令,但是subprocess模块是python官方推荐使用的方法,因为subprocess可以更好地支持子进程的使用。
一、os模块
1. os.system
- system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果,在页面上打印的命令执行结果 0、1或者其他数字,这些数字代表了命令的正确或者错误原因。
- system方法比较适用于外部程序没有输出结果的情况,因为执行的结果会直接打印出来,如果需要打印的结果可以使用os.popen方法。
- system方法已经过时,现在官方推荐是使用subprocess模块中的方法,下面也会介绍。
python shell 命令:
>>> import os
>>> os.system (‘ls’)
bin boot dev etc home # 返回ls的结果
0 # 返回的结果0,代表命令正确
2. os.popen
- popen方法返回的是一个 file 的对象,可以对其进行读取,通过read()或readlines() 的操作可以看到执行的输出。
- popen方法无法读取程序执行的返回值。
python shell 命令:
>>> import os
>>> p = os.popen(‘ls’)
>>> content = p.read()
>>> print content
bin boot dev etc home # 打印ls的结果
>>> p.close()
二、subprocess模块
1. subprocess.call
- subprocess模块的call函数。它基本上就像Popen类并都使用相同的参数,但是它只简单的等待命令完成并返回代码。
python shell 命令:
>>> import subprocess
>>> subprocess.call([“ls”, “-l”])
0 # 返回的结果0,代表命令正确
- 使用了shell=True这个参数。这个时候,使用一整个字符串,而不是一个表来运行子进程。Python将先运行一个shell,再用这个shell来解释这整个字符串。
python shell 命令:
>>> import subprocess
>>> subprocess.call(“ls -l”, shell=True)
0 # 返回的结果0,代表命令正确
2. subprocess.popen
- Popen对象创建后,主程序不会自动等待子进程完成。必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block)。
python 代码:
import subprocess
child = subprocess.Popen("ping -c 5 www.baidu.com",shell=True)
# 此时会先打印出end, 并不会等待子进程完成
print 'end'
import subprocess
child = subprocess.Popen("ping -c 5 www.baidu.com",shell=True)
child.wait()
# 此时会等待子进程完成,再打印end
print 'end'
- Popen方法如果需要对输出进行读取,可以使用communicate()方法。
import subprocess
pipe= subprocess.Popen("ls -l", shell=True, stdout=subprocess.PIPE)
# 使用communicate()来获取指令的输出
content = pipe.communicate()
print content
三、commands模块
1. commands.getoutput
- 使用getoutput方法,这种方法同popen的区别在于popen返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。
python shell 命令:
>>> import commands
>>> commands.getoutput(‘ls /bin/ls’)
‘/bin/ls’
2. commands.getstatusoutput
- 使用getstatusoutput方法,返回的结果为(status, output)
python shell 命令:
>>> import commands
>>> commands.getstatusoutput(‘ls /bin/ls’)
(0, ‘/bin/ls’)
3. commands.getstatus
- 使用getstatus方法,返回ls -ld file的执行结果字符串,调用了getoutput方法,不建议使用此方法
python shell 命令:
>>> import commands
>>> commands.getstatus(‘/bin/ls’)
‘-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls’