似乎都执行一个子进程并创建一个管道来执行输入/输出,只是subprocess
较新。
我的问题是,有没有什么功能可以subprocess.Popen
可以做一会儿os.popen
不能,所以我们需要新模块subprocess
?
为什么Python语言没有选择增强os.popen
但创建了一个新模块?
简短回答:永远不要使用os.popen
,始终使用subprocess https://docs.python.org/3/library/subprocess.html!
从Python 2.7可以看出os.popen docs https://docs.python.org/2/library/os.html#os.popen:
自 2.6 版起已弃用:此函数已过时。使用subprocess
模块。特别检查替换旧功能
与子流程
模块 https://docs.python.org/2/library/subprocess.html#subprocess-replacements部分。
旧版本存在各种限制和问题os.popen
函数族。正如文档提到的,2.6 之前的版本在 Windows 上甚至都不可靠。
背后的动机subprocess
解释于PEP 324 -- 子流程 - 新流程模块 https://www.python.org/dev/peps/pep-0324:
动机
启动新进程是任何编程语言中的常见任务,
在 Python 等高级语言中非常常见。良好的支持
需要执行此任务,因为:
目前,Python有大量不同的函数用于
流程创建。这让开发商难以选择。
子流程模块提供了以下增强功能
以前的功能:
一个“统一”模块提供了以前的所有功能
功能。
跨进程异常:子进程中发生的异常
在新进程开始执行之前被重新引发
家长。这意味着很容易处理 exec()
例如,失败。以 popen2 为例,它是
无法检测执行是否失败。
用于在 fork 和 exec 之间执行自定义代码的挂钩。这
例如,可用于更改 uid。
没有隐式调用 /bin/sh。这意味着没有必要
用于转义危险的 shell 元字符。
文件描述符重定向的所有组合都是可能的。
例如,“python-dialog”[2]需要生成一个进程
并重定向 stderr,但不重定向 stdout。这是不可能的
当前功能,不使用临时文件。
通过subprocess模块,可以控制是否全部打开
文件描述符应该在新程序运行之前关闭
被执行。
支持连接多个子进程(shell“管道”)。
通用换行符支持。
一个communicate()方法,可以很容易地发送stdin数据
并读取 stdout 和 stderr 数据,而不会有死锁的风险。
大多数人都知道涉及的流量控制问题
孩子进行沟通,但并不是所有人都有耐心或
编写完全正确且无死锁的选择循环的技能。
这意味着许多Python应用程序都包含race
状况。标准库中的communicate()方法
解决了这个问题。
请参阅 PEP 链接了解基本原理和更多详细信息。
除了安全性和可靠性问题之外,恕我直言,旧的os.popen
家庭是繁琐和混乱的。在编码时如果不仔细参考文档,几乎不可能正确使用。相比下,subprocess
是天赐之物,尽管在使用它时参考文档仍然是明智的。 ;)
有时,人们会推荐使用os.popen
而不是subprocess.Popen
在Python 2.7中,例如Python 子进程与 os.popen 开销 http://essays.ajs.com/2011/02/python-subprocess-vs-ospopen-overhead.html因为它更快。当然,它更快,但那是因为它没有做各种对于保证其安全工作至关重要的事情!
FWIW, os.popen它本身仍然存在于 Python 3 中 https://docs.python.org/3/library/os.html#os.popen,但是它是通过以下方式安全实现的subprocess.Popen
,所以你不妨只使用subprocess.Popen
直接你自己。该委员会的其他成员os.popen
Python 3 中不再存在族。os.spawn
Python 3 中仍然存在一系列函数,但文档建议使用由subprocess
可以使用模块来代替。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)