subprocess.Popen 和 os.system 之间的区别
- 2025-02-12 10:03:00
- admin 原创
- 62
问题描述:
subprocess.Popen()
和有什么区别os.system()
?
解决方案 1:
如果您查看Python 文档的子进程部分,您会注意到有一个如何替换的os.system()
示例subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
...与...做同样的事情
sts = Popen("mycmd" + " myarg", shell=True).wait()
“改进的”代码看起来更复杂,但它更好,因为一旦你知道了subprocess.Popen()
,你就不需要任何其他东西了。subprocess.Popen()
替换了分散在其他三个 Python 模块中的几个其他工具(os.system()
只是其中之一)。
如果有帮助的话,想象subprocess.Popen()
一下非常灵活的os.system()
。
解决方案 2:
subprocess.Popen()
是 的严格超集os.system()
。
解决方案 3:
os.system
相当于 Unixsystem
命令,而subprocess
是一个辅助模块,用于为命令提供的许多功能提供Popen
更简单、更可控的界面。它们的设计类似于Unix Popen命令。
system()
通过调用 执行 command 中指定的命令/bin/sh -c command
,并在命令完成后返回
然而:
该
popen()
函数通过创建管道、分叉和调用 shell 来打开一个进程。
如果您正在考虑使用哪一个,那么subprocess
肯定使用,因为您拥有所有的执行设施,以及对流程的额外控制。
解决方案 4:
Subprocess 基于 popen2,因此具有许多优点 -这里的 PEP中有一个完整列表,但其中包括:
在 shell 中使用管道
更好的换行支持
更好地处理异常
解决方案 5:
在 Windows 上运行 python(cpython)时,<built-in function system>
os.system将在_wsystem下执行,而如果您使用非 Windows 操作系统,它将使用system。
相反,Popen 应该在 Windows 上使用CreateProcess ,在基于 posix 的操作系统上使用_posixsubprocess.fork_exec 。
也就是说, os.system文档中有一个重要的建议,其中说:
subprocess 模块提供了更强大的功能,用于生成新进程并检索其结果;使用该模块比使用此功能更可取。请参阅 subprocess 文档中的使用 subprocess 模块替换旧函数部分,了解一些有用的方法。