Python 2.6中os.popen是否已经被弃用?

7

在线文档指出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

不发出警告。三种可能的情况如下:

  1. 文档和标准库对于何为弃用有不同的理解,这是预期行为;
  2. 文档存在错误,os.popen并非真正被弃用;
  3. 标准库存在错误,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上的回复

补充: 感谢下面的cobbal , 原来os.popen在Python 3.1中并没有被弃用。


1
这有什么关系呢?为什么你需要知道“正确”的原因呢?它被声明为弃用,subprocess.Popen是替代品。你还需要知道什么?知道这个能如何改进你的代码呢? - S.Lott
3
亲爱的S.Lott,我知道作为非英语母语者,始终保持完全清晰并不总是容易的,因此如果我的写作不容易理解,请原谅。但是能否请您尽量阅读我的问题呢?我不是在问原因,而是问错在谁或什么地方:文档、发布的Python代码还是我自己期望两者一致。 - krawyoti
2
亲爱的S.Lott,让我尝试一种不同的方法。你为什么说os.popen已经过时了?我可以声称文档是错误的。只有popen2、popen3等实际上已经过时,而直接从posix.popen中提取的os.popen并没有。请将第44行与http://svn.python.org/view/python/tags/r262/Lib/os.py中的第669行进行比较。 - krawyoti
3
亲爱的S.Lott,根据常见问题解答,问题不一定要围绕着错误或无法工作的代码。如果您不明白一个函数是否被弃用对软件可维护性的重要性,我认为适当的做法是提出一个单独的问题,我很乐意为之提供答案。 - krawyoti
1
我在这些评论中的对话中笑了。 - Ryan Haining
显示剩余4条评论
4个回答

5
这是PEP(Python增强提案)的链接:PEP
Deprecated modules and functions in the standard library:

    - buildtools
    - cfmfile
    - commands.getstatus()
    - macostools.touched()
    - md5
    - MimeWriter
    - mimify
    - popen2, os.popen[234]()
    - posixfile
    - sets
    - sha

4

我认为有一件事情值得注意,就是在Python3中存在os.popen,而os.popen2则不存在。因此,其中一个函数比另一个更加"过时",并且很快可能从语言中移除。


有趣的是:在Python 3.1中,不仅os.popen仍然存在,而且它甚至没有被弃用。请参见http://docs.python.org/3.1/library/os.html。 - krawyoti

3

同时,我已经在Python问题跟踪器上打开了一个。在该票关闭之前,我将保持这个问题处于开放状态。


恭喜您提出如此有洞察力的问题,并通过正式渠道帮助推动解决这种差异。到目前为止,看起来 popen 将会保留,并得到文档支持。耶! - nealmcb

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接