subprocess.Popen和os.system之间的区别


Answers:


99

如果您查看Python文档subprocess部分,您会注意到有一个示例如何替换os.system()subprocess.Popen()

sts = os.system("mycmd" + " myarg")

...与...具有相同的作用

sts = Popen("mycmd" + " myarg", shell=True).wait()

“改进的”代码看起来更复杂,但是更好,因为一旦知道了subprocess.Popen(),就不需要其他任何东西。subprocess.Popen()替换了os.system()分散在其他三个Python模块中的其他几个工具(仅是其中的一种)。

如果有帮助,可以认为它subprocess.Popen()是非常灵活的os.system()


您也可以使用sts = p.wait()而不是最后一行。
Sven Marnach 2011年

1
@JacobMarble因此,假设我正在从另一个python脚本调用一个硒抓取脚本,这些脚本中的哪一个可以让我完成抓取脚本,然后才执行下一行代码?与之类似,我的抓取应在执行继续之前完成。
Prakhar Mohan Srivastava'Mar

也许还提到stackoverflow.com/questions/3172470/…来指出,shell=True如果可以的话,应该避免使用。拥有此选项是的好处之一,subprocess.Popen()并且是其辅助功能。
三点

@PrakharMohanSrivastava如果您想阻止流程并等待命令完成其工作,请签出:stackoverflow.com/a/2837319/5252192
AmirHossein

@PrakharMohanSrivastava,一般二者os.systemsubprocess.call/popen/run确实块/等待命令完成:stackoverflow.com/a/14059648/4752883
alpha_989


22

os.system等效于Unix system命令,同时subprocess创建了一个帮助程序模块,以提供Popen命令提供的许多功能,并提供一个更容易控制的界面。它们的设计类似于Unix Popen命令。

system()通过调用执行命令中指定的命令/bin/sh -c command,命令完成后返回

鉴于:

popen()函数通过创建管道,派生和调用外壳程序来打开进程。

如果您正在考虑使用哪一个,那么subprocess一定要使用它,因为您具有执行的所有功能以及对该过程的额外控制。


好的..那有什么办法可以在Windows env中执行os.system和popen吗?我是一个新手,需要深入挖掘..
Arovit

是的,您可以在Windows环境中同时使用os.system和子进程。看一看effbot.org的基础教程(Python标准库在线书)
Senthil Kumaran

小心-如果您在较旧的系统上运行,则子流程模块不可用。
史蒂夫·哈诺夫


2

当运行在Windows上的Python(CPython的)的<built-in function system> 使用os.system将窗帘下执行_wsystem而如果你使用非Windows操作系统,它会利用系统

相反,Popen应该在Windows上使用CreateProcess,在基于posix的操作系统中使用_posixsubprocess.fork_exec

就是说,重要的建议来自os.system docs,它说:

子流程模块提供了更强大的功能来生成新流程并检索其结果。使用该模块优于使用此功能。有关一些有用的食谱,请参见子过程文档中的用子过程模块替换较早的功能部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.