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

时间:2012-12-12 04:22:04

标签: python subprocess

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

cmd = "ls"
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)

然后,我希望在完成后获得它的返回码。我应该使用wait()poll()?在我看来,wait()等于忙碌等待中的poll()。类似的东西:

while process.poll() == None:
    time.sleep(0.5)

我读到如果wait()缓冲区已填满,stdout/stderr可能会产生死锁。上面使用的process.poll()也会产生死锁?如果这是真的, 我应该使用process.comunicate()来解决问题?如今,我只使用 当我对子流程process.comunicate()感兴趣时,stdout/stderr

提前致谢。

1 个答案:

答案 0 :(得分:4)

是。 subprocess.poll,当在这样的循环中使用时,如果stdout通过管道进入您的进程并且您没有从中读取,则会导致死锁。如果你没有管道stdout或者你一直在阅读它,那么pollwait都不会死锁。 subprocess.communicate将解决它将发生的情况下的僵局。但是,如果您只想运行命令,检查其返回代码并获取其输出,请使用subprocess.check_output,其中包含所有这些。