繁体   English   中英

subprocess.Popen 和 os.system 的区别

[英]Difference between subprocess.Popen and os.system

是什么区别subprocess.Popen()os.system()

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

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

......和......做同样的事情

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

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

如果有帮助,想subprocess.Popen()作为一个非常灵活的os.system()

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

os.system相当于Unix的system命令,而subprocess是为了提供许多的由所提供的设施的辅助模块Popen命令与一个更简单的和可控制的接口。 这些设计类似于Unix Popen命令。

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

鉴于:

popen()函数通过创建管道、分叉和​​调用 shell 来打开一个进程。

如果您正在考虑使用哪一个,那么绝对使用subprocess因为您拥有所有执行设施,以及对流程的额外控制。

子进程基于 popen2,因此具有许多优点 - 此处的PEP 中有完整列表,但有些是:

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

在 Windows 上运行 python (cpython) 时, <built-in function system> os.system将在_wsystem 幕布下执行,而如果您使用的是非 Windows 操作系统,它将使用system

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM