subprocess模块指南

subprocess模块指南

翻译: gashero

目录

从Python2.4开始引入。

subprocess模块用于产生一个新的进程,并且连接到其input/output/error管道,并获取返回码。这个模块准备用于替换很多其他旧模块中的函数,例如 os.system 、 os.spawn* 、 os.popen* 、 popen2.* 、 commands.* 。

详细细节见下面。

1   使用subprocess模块

模块中只是定义了一个类叫做 Popen

class Popen(args,bufsize=0,executable=None,stdin=None,stdout=None,stderr=None,preexec_fn=None,close_fds=False,shell=False,cwd=None,env=None,universal_newlines=False,startupinfo=None,creationflags=0)

参数描述如下:

@waiting…

1.1   便利函数

该模块定义了两个快捷函数:

call(*popenargs,**kwargs)

使用指定的参数运行命令,并等待命令结束,然后返回返回码。参数与Popen结构相同,例如:

retcode=call(["ls","-l"])

check_call(*popenargs,**kwargs)

使用指定参数运行命令,等待结束。如果退出码是0则返回,否则抛出 CalledProcessError 异常。而该异常对象包含了返回码,称为 returncode 属性。

参数与Popen结构相同,例如:

check_call(["ls","-l"])

从Python2.5开始引入。

1.2   异常

子进程中抛出的异常可以传递到父进程。另外,异常对象包含一个附加属性叫做 child_traceback ,是一个字符串,包含了子进程那里可以看到的错误回调信息。

最常见的异常是 OSError 。例如尝试执行一个不存在的文件。应用应该防备OSError异常。

在调用Popen而使用了无效的参数时会抛出ValueError异常。

check_call() 将会抛出 CalledProcessError ,在进程返回码不是0时。

1.3   安全

不像其他popen函数,这个实现不会隐含调用 /bin/sh 。这意味着所有的字符,甚至shell的元字符,都可以安全的传递到子进程。

2   popen对象

Popen的实例拥有如下方法:

poll()

检查子进程是否结束,并返回returncode属性。

wait()

等待子进程结束,返回returncode属性。

communicate(input=None)

与进程交互:发送数据岛stdin。从stdout和stderr读取数据,直到接收到end-of-file。等待进程结束。可选的input参数是要发送到子进程的字符串,或者为None。

communicate() 返回元组 (stdout,stderr) 。

注意:读取的数据缓存在内存里,所以在数据很大或者不受限制时不要使用这个方法。

如下属性也可用:

stdin

如果stdin参数为PIPE,这个属性提供了子进程的标准输入,否则为None。

stdout

如果stdout参数为PIPE,……

stderr

如果stderr参数为PIPE,……

pid

子进程的进程ID。

returncode

子进程的返回码,在还没有返回时则为None。一个否定值-N表示子进程是被信号N所终止的(仅Unix)。

3   使用subprocess替换旧模块

Leave a Reply