作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!
参考链接
http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html
父子进程的概念
一个进程可以fork自身,成为一个子进程,并让子进程去exec另外一个程序
python中的子进程
python中通过subprocess包,来fork一个子进程,并运行一个外部程序
需思考的点
创建子进程后,父进程是否阻塞
函数返回什么
returncode不为0时(说明不是子进程),父进程如何处理
简单使用
subprocess.call()
父进程等待子进程完成
返回退出信息(returncode)
subprocess.check_call()
父进程等待子进程完成
返回0
会检查退出信息(returncode),如果returncode不为0则抛出subprocess.CalledProcessError错误,该对象包含有returncode属性,可用try...except...来检查
subprocess.check_output()
父进程等待子进程完成
返回子进程向标准输出的输出结果
会检查退出信息(returncode),如果returncode不为0则抛出subprocess.CalledProcessError错误,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,同样可用try...except...来检查
简单使用举例
list传参
将程序名ls和参数-l放在一个表中传递给subprocess.call()
rc = subprocess.call(["ls","-l"])
string传参
先运行一个shell,再用shell来解释整个字符串
一些shell的内建命令必须使用shell来运行
out = subprocess.call("ls -l", shell=True)
高级使用 - 子进程并行&文本流
subprocess.Popen类
__init__(self, 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)
Popen对象创建后,父进程不会自动等待子进程完成
child = subprocess.Popen(["ping","-c","5","www.google.com"])
child.pid - 子进程的pid
child.stdin - 子进程的stdin
child.stdout - 子进程的stdout
child.stderr - 子进程的stderr
child.wait() - 父进程等待子进程完成
child.poll() - 检查子进程状态
child.send_signal(sig) - 给子进程发送信号
child.kill() - 终止子进程
child.terminate() - 终止子进程,与kill相等
child.communicate(input=None) - 给予子进程stdin后,获得子进程的输出流,返回结果为元组类型(stdout,stderr)。需注意该方法会阻塞当前进程。
高级使用举例
父子进程并行
child = subprocess.Popen(["ping","-c","5","www.google.com"])
print("parent process")
子进程stdout导向另一子进程stdin
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
子进程等待当前进程输入
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")