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

Aro*_*vit 97 python subprocess system

subprocess.Popen()和之间有什么区别os.system()

Jac*_*ble 89

如果检查出Python文档的子部分,你会发现有一个如何来代替的例子os.system()subprocess.Popen():

sts = os.system("mycmd" + " myarg")
Run Code Online (Sandbox Code Playgroud)

......做同样的事......

sts = Popen("mycmd" + " myarg", shell=True).wait()
Run Code Online (Sandbox Code Playgroud)

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

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


Jan*_*dec 42

subprocess.Popen()严格超集os.system().

  • 这是完全优雅的答案. (8认同)
  • 它很优雅,但并不完整,因为它没有描述“os.system”缺少什么,或者为什么您可能需要“Popen”。 (6认同)

Sen*_*ran 21

os.system等同于Unix 系统命令,而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
Run Code Online (Sandbox Code Playgroud)

在哪里

The popen() function opens a process by creating a pipe, forking, and invoking the shell.
Run Code Online (Sandbox Code Playgroud)

如果您正在考虑使用哪一个,那么请务必使用进程,因为您拥有所有执行工具,并且可以对该进程进行额外控制.


And*_*ula 20

子流程基于popen2,因此具有许多优点 - 这里有一个完整的PEP列表,但有些是:

  • 在shell中使用管道
  • 更好的换行支持
  • 更好地处理异常


BPL*_*BPL 5

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

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

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

subprocess 模块提供了更强大的工具来生成新进程并检索它们的结果;使用该模块比使用此功能更可取。有关一些有用的秘诀,请参阅子流程文档中的用子流程模块替换旧函数部分。