subprocess.Popen()
和os.system()
之间的区别是什么?
答案 0 :(得分:79)
如果您查看了subprocess section of the Python docs,就会发现有一个示例说明如何将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()
。
答案 1 :(得分:37)
subprocess.Popen()
是os.system()
的严格超集。
答案 2 :(得分:20)
子流程基于popen2,因此有许多优点 - PEP here中有一个完整的列表,但有些是:
答案 3 :(得分:20)
os.system等同于Unix system命令,而subprocess是一个辅助模块,用于提供Popen命令提供的许多功能,并提供更简单,可控的接口。这些设计与Unix Popen命令类似。
system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed
其中
The popen() function opens a process by creating a pipe, forking, and invoking the shell.
如果您正在考虑使用哪一个,那么请使用子流程,因为您拥有所有执行工具,并且可以对该流程进行额外控制。
答案 4 :(得分:2)
在Windows上运行python(cpython)时,foreach (var d in digits) binaryList.Add(int.Parse(d));
os.system将在窗帘_wsystem下执行,而如果您使用的是非Windows操作系统,它将使用{{ 3}}
相反,Popen应该在Windows上使用system,在基于posix的操作系统中使用CreateProcess。
也就是说,一个重要的建议来自_posixsubprocess.fork_exec文档,其中说:
子进程模块为产卵提供了更强大的功能 新流程并检索其结果;使用该模块是 比使用这个功能更好。请参阅更换旧功能 使用子流程文档中的子流程模块部分 一些有用的食谱。