subprocess.Popen()
和os.system()
有什么区别?
subprocess.Popen()
和os.system()
有什么区别?
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()
。subprocess.Popen()
是 os.system()
的严格超集。
os.system
缺少了什么,或者为什么你可能需要使用Popen
。 - naught101os.system
相当于Unix system
命令,而subprocess
是一个帮助模块,旨在提供许多由Popen
命令提供的功能,具有更简单和可控的接口。这些命令设计类似于Unix Popen命令。
system()
通过调用/bin/sh -c command
来执行指定为command的命令,并在命令完成后返回。
然而:
popen()
函数通过创建管道、fork和调用shell来打开进程。
如果你想决定使用哪个命令,则绝对使用subprocess
,因为你拥有所有执行的设施,同时还可以额外控制进程。
Subprocess 基于 popen2,因此有许多优点 - 这里PEP列出了完整的列表,但其中一些包括:
<built-in function system>
os.system 将在幕后执行 _wsystem,而如果您使用的是非Windows操作系统,则将使用system。子进程模块提供了更强大的生成新进程和检索其结果的功能;使用该模块比使用此函数更可取。请参阅子进程文档中的“用子进程模块替换旧函数”部分,以获取一些有用的示例。
sts = p.wait()
替代最后一行。 - Sven Marnachshell=True
。拥有这个选项是subprocess.Popen()
及其辅助函数的好处之一。 - tripleeeos.system
和subprocess.call/popen/run
都会阻塞/等待命令执行完成:https://dev59.com/PmYq5IYBdhLWcg3w8lNo#14059648 - alpha_989sts = os.system("mycmd" + " myarg")
现在变成了retcode = call("mycmd" + " myarg", shell=True)
。 - user13237611