Python并行操作 - 父子进程 subprocess库

Posted yc紫日

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python并行操作 - 父子进程 subprocess库相关的知识,希望对你有一定的参考价值。

作者: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")

以上是关于Python并行操作 - 父子进程 subprocess库的主要内容,如果未能解决你的问题,请参考以下文章

父子进程

进程--python

python 线程进程并发并行协程进程池互斥锁

python 线程进程并发并行协程进程池互斥锁

python网络编程基础(线程与进程并行与并发同步与异步)

面试中常被问到的(18)父子进程,孤儿进程及僵尸进程