Popen.poll()和Popen.wait()之间的区别

Ala*_*sta 7 python subprocess

我正在使用以下命令来运行shell命令(创建子进程):

cmd = "ls"
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
Run Code Online (Sandbox Code Playgroud)

然后,我想在它完成时获得它的返回码.我应该用wait()poll()?在我看来,wait()等于poll()在繁忙的等待中封闭.就像是:

while process.poll() == None:
    time.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)

我读过wait()如果stdout/stderr填充缓冲区会产生死锁.process.poll()像上面那样使用也会产生死锁?如果这是真的,我应该process.comunicate()用来解决问题?如今,我只process.comunicate()在我对子流程感兴趣时使用 stdout/stderr.

提前致谢.

ick*_*fay 4

是的。,当在这样的循环中使用时,如果将其通过管道传输到您的进程中并且您没有从中读取数据,subprocess.poll则会导致死锁。stdout如果您不使用管道stdout或始终从中读取内容,则不会poll出现wait死锁。subprocess.communicate将解决发生死锁的情况。但是,如果您只想运行命令,检查其返回代码并获取其输出,请使用subprocess.check_output,它包装了所有这些内容。

  • @AlanEvangelista:显然,这是一个 hack,但在使用 Python 2.6 的系统上,我刚刚将 2.7 `subprocess.py` 复制到相应的 2.6 目录中,并进行了一些语法更改(2.6 中没有设置文字符号,如果我记得)并且效果很好。 (2认同)