调用系统命令
1、简单的调用
1.1 os.system
import os
os.system('dir')
dir产生的屏显将直接出现在当前的屏幕上。
返回值和执行环境有关。如果是windows的cmd.exe环境,返回值是状态码。0代表成功,1代表失败。比如,如果不小心敲错了,把dir写成了ddir,那么由于找不到这条命令,返回码会是1。
1.2 subprocess.call
import subprocess
subprocess.call('dir',shell=True)
效果同上。
因为dir是cmd.exe的内置命令,所以需指出shell=True,强调这条命令要被放在shell(cmd.exe)中执行的。如果这个参数缺失,dir会被当做一般的可执行文件直接调用,由于找不到名为dir的可执行文件,会报错。
1.3 subprocess.Popen
import subprocess
subprocess.Popen('dir',shell=True)
这个和上一条基本是等价的。不同之处在于,call返回的是状态码,而Popen返回的是一个进程对象,这个对象可以有更高级的用途,下面将说到。
2、捕获屏幕输出
2.1 Popen.stdout
如果想检查一下执行过程中的屏显,而不是直接抛给用户,那就涉及到Popen的高级用途了
from subprocess import Popen, PIPE
p = Popen("dir", shell=True, stdout=PIPE)
output = p.stdout.read() #捕获屏显,而不是直接显示给用户
print output
这里PIPE就是一个常量,等于-1。将其赋给参数stdout有一个特殊的含义,那就是将执行所产生的屏显重新定向到Popen.stdout。
Popen.stdout是一个管道对象,可以通过read、readline等方法读取管道的内容。
3、进一步交互
3.1 Popen.communicate
如果调用程序之后还需要进行输入输出的交互,那么就要用到communicate函数。
下面的代码先打开一个cmd.exe进程,然后在其中执行dir命令,然后捕获输出。
from subprocess import Popen, PIPE
p = Popen("cmd.exe", stdin=PIPE, stdout=PIPE, stderr=PIPE) #打开一个cmd.exe
output,err = p.communicate('dir\n') #输入dir命令,同时捕获输出
print output
print err
communicate接收一个参数,作为输入。返回两个值,分别是stdout和stderr的内容。