【发布时间】:2009-07-08 13:57:19
【问题描述】:
在线documentation 声明 os.popen 现在已弃用。所有其他不推荐使用的函数都会适当地引发 DeprecationWarning。例如:
>>> import os
>>> [c.close() for c in os.popen2('ps h -eo pid:1,command')]
__main__:1: DeprecationWarning: os.popen2 is deprecated. Use the subprocess module.
[None, None]
另一方面,函数 os.popen 默默地完成:
>>>len(list(os.popen('ps h -eo pid:1,command')))
202
没有发出警告。在三种可能的情况中
- 预期的行为是文档和标准库对弃用的内容有不同的想法;
- 文档中有错误,os.popen 并未真正被弃用;
- 标准库中存在错误,os.popen 应发出警告;
哪个是正确的?
有关背景信息,这是我正在使用的 Python:
>>> import sys
>>> print sys.version
2.6.2 (r262:71600, May 12 2009, 10:57:01)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)]
os.popen 的参数取自 Stack Overflow 上的 reply of mine。
附录:感谢 cobbal below,毕竟 Python 3.1 中并没有弃用 os.popen。
【问题讨论】:
-
有什么关系?为什么你需要知道“正确”的原因?它声称已弃用,而 subprocess.Popen 是替代品。你还需要知道什么?知道它如何改进你的代码?
-
我猜实际上很多很多代码都依赖于这个函数。
-
亲爱的 S.Lott,我知道对于非英语母语的人来说,总是很清楚并不总是那么容易,所以如果我写的东西不容易理解,我深表歉意。但是请您,非常请您至少努力阅读我的问题吗?我不是问什么原因。我在问谁或出了什么问题:文档、发布的 Python 代码,或者我自己期望两者是一致的。
-
亲爱的 S. Lott,让我尝试不同的方法。你为什么说 os.popen 已被弃用?我可以声称文档是错误的。实际上只弃用了 popen2、popen3 等,而直接从 posix.popen 提升的 os.popen 则没有。请比较svn.python.org/view/python/tags/r262/Lib/os.py中的第44行和第669行
-
亲爱的 S.Lott,根据常见问题解答,问题不必围绕损坏或不工作的代码。如果您不明白为什么某个功能是否被弃用对软件的可维护性很重要,我认为适当的做法是让您提出一个单独的问题,我很乐意提供答案。
标签: python deprecated std