Python subprocess.Popen()等待执行完成。

39

我正在编写一个小脚本,按顺序遍历目录并在其中的子目录上运行命令。

然而,我使用的 Popen() 函数会在不等待前一个命令完成的情况下遍历目录并运行所需的命令。

for dir in dirs:
    #run command on the directory here.

它会在不关心每个目录的情况下启动命令。我希望它等待当前的命令执行完成,然后再启动下一个。我正在使用的工具是SANS SIFT中的Log2timeline,它需要相当长的时间并产生大量输出。我不关心输出,只想让程序在启动下一个命令之前等待。

有什么最好的方法来实现这个?

谢谢!


与程序设计相关的内容:丢弃子进程的输出,可以参考如何在Python 2.7中隐藏子进程的输出 - jfs
2个回答

67

使用Popen.wait

process = subprocess.Popen(["your_cmd"]...)
process.wait()

或者使用check_outputcheck_call,它们都会等待返回代码,具体取决于你想要做什么以及Python的版本。

如果你正在使用Python >= 2.7,并且不关心输出,只需使用check_call

你也可以使用call,但这样做不会在存在非零返回代码时引发任何错误,这可能是需要也可能不需要的。


16
subprocess.check_output( ... )

将阻塞执行,并可用于替代Popen。

但是如果您坚持要使用Popen。

subprocess.Popen(...).communicate() 

它还会阻塞,直到进程返回


2
这里不需要使用check_output.communicate(),因为[subprocess]会产生大量输出。我不关心输出。应该使用call()check_call() - jfs
啊,好观点 :P 这就是我没看的后果...话虽如此,这些例子中的输出都被丢弃了。 - Joran Beasley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接