调用系统命令

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的内容。

posted @ 2014-07-14 18:40  大侠柯镇恶  阅读(796)  评论(0编辑  收藏  举报