我正在使用以下命令来运行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
。
提前致谢。
答案 0 :(得分:4)
是。 subprocess.poll
,当在这样的循环中使用时,如果stdout
通过管道进入您的进程并且您没有从中读取,则会导致死锁。如果你没有管道stdout
或者你一直在阅读它,那么poll
和wait
都不会死锁。 subprocess.communicate
将解决它将发生的情况下的僵局。但是,如果您只想运行命令,检查其返回代码并获取其输出,请使用subprocess.check_output
,其中包含所有这些。