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