8

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

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

然后,我想在它完成后得到它的返回码。我应该使用wait()or poll()?在我看来,这wait()等于是一个poll()封闭在忙碌的等待中。就像是:

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

我读到如果缓冲区已满,wait()可能会产生死锁。像上面那样使用也会产生死锁吗?如果这是真的,我应该用什么来解决问题?现在,我只 在对 subprocess 感兴趣时使用。stdout/stderrprocess.poll()process.comunicate()process.comunicate()stdout/stderr

提前致谢。

4

1 回答 1

4

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

于 2012-12-12T04:25:34.487 回答