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)。