原文链接:https://blog.csdn.net/liuyingying0418/article/details/100939697
subprocess.Popen()用法
subprocess.Popen()主要是用来在python中实现多进程程序。例如,在python脚本中,我们需要执行另一个python脚本,或者执行shell命令或者shell脚本,这种情况下就要用到python的多进程方法了。本文仅介绍subprocess.Popen()方法,python多进程还有很多其他方法,参考:多进程–廖雪峰
subprocess.Popen()的使用格式:
————————————————
class subprocess.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)
各个参数的含义:
Popen的属性
子进程结束的判断
import subprocess as sp
p = sp.Popen(['echo','helloworl.py'], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
print(p.poll())
print('Exit code:', p.returncode)
打印结果如下,在上述代码中我们仅仅创建了一个Popen对象,然后开启了子进程,随后通过poll()和returncode查看子进程的返回码,从结果来看,子进程没有结束主进程就退出了。
None
Exit code: None
下面我们通过读取stdout的内容来看看子进程会不会正常结束:
import subprocess as sp
p = sp.Popen(['echo','helloword.py'], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
print((p.stdout.readlines())[0].decode(), end='')
print(p.poll())
print('Exit code:', p.returncode)
结果如下,可以看到,结果仍然是子进程没有结束。
helloword.py
None
Exit code: None
前面说到,wait会等待子进程结束,那么我们试试执行wait看看:
import subprocess as sp
p = sp.Popen(['echo','helloword.py'], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
print(p.poll())
print(p.wait())
print('Exit code:', p.returncode)
结果可以看到,在wait之前子进程并没有结束,wait执行返回的值0,returncode也是0,表明子进程正常执行并结束了。
None
0
Exit code: 0
虽然wait可以让子进程正常结束,但是如果缓存中太多数据的话会导致死锁,因此我们采用communicate:
import subprocess as sp
p = sp.Popen(['echo','helloword.py'], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
output, err = p.communicate()
print(output.decode('gbk'), end='')
print(err.decode('gbk'))
print(p.poll())
print('Exit code:', p.returncode)
结果如下,可见在communicate之后,子进程正常执行,缓存中的数据被读取出来,poll和returncode都返回0,表明子进程已正常结束。output是子进程执行输出的信息,err是执行异常时的报错信息,此处可以看到报错信息为空,说明子进程顺利执行,没有错误发生。
helloword.py
0
Exit code: 0