Python中的子进程调用是否挂起?也就是说,子进程调用是否与Python代码的其余部分在同一个线程中运行,还是非阻塞模型?我无法在文档中找到任何内容或在此问题上找到任何内容。谢谢!
答案 0 :(得分:3)
subprocess
模块中的大多数方法都是阻塞的,这意味着他们希望在返回之前完成子进程。但是,subprocess.Popen
是非阻止的。
result = subprocess.call(cmd) # This will block until cmd is complete
p = subprocess.Popen(cmd) # This will return a Popen object right away
获得Popen
对象后,可以使用poll
实例方法查看子进程是否完整而不会阻塞。
if p.poll() is None: # Make sure you check against None, since it could return 0 when the process is complete.
print "Process is still running"
答案 1 :(得分:2)
子进程在后台运行。在子进程模块中,有一个名为Popen的类在后台启动进程。它有一个wait()方法,您可以使用它等待进程完成。它还有一个communic()辅助方法,它将处理stdin / stdout / stderr以及等待进程完成。它还有一些方便的函数,比如call()和check_call(),它们创建一个Popen对象,然后等待它完成。
因此,subprocess实现了非阻塞模型,但也为您提供了阻塞辅助函数。