何时使用Popen(),何时使用call()?

1 投票
1 回答
1070 浏览
提问于 2025-04-16 18:03

注意:我刚接触Python。

想听听真正使用它的专业人士的看法:

请问 subprocess.Popen()subprocess.call() 之间的主要区别是什么?什么时候最好使用它们各自呢?

如果你不想了解我为什么会问这个问题,或者想围绕什么来回答,可以直接停止阅读。

我之所以想问这个问题,是因为我在处理一个脚本中的问题。我开始使用 subprocess.Popen(),然后调用了一个系统暂停,接着想删除那个造成系统暂停的.exe文件,但我发现使用 Popen() 时,所有命令似乎都一起执行了(删除.exe的命令在.exe关闭之前就执行了……),尽管我尝试添加了 communicate()

下面是我描述的内容的伪代码:

subprocess.Popen(r'type pause.exe > c:\worker.exe', shell=True).communicate()
subprocess.Popen(r'c:\worker.exe', shell=True).communicate()
subprocess.Popen(r'del c:\worker.exe', shell=True).communicate()

1 个回答

7

subprocess.call(*popenargs, **kwargs) 是一个用来运行命令和参数的函数。它会等这个命令执行完毕,然后返回一个叫做 returncode 的值。

如果你创建了一个 Popen 对象,你需要自己去调用 sp.wait() 来等待命令完成。

但如果你使用 call,这个等待的过程会自动帮你完成。

撰写回答