【问题标题】:Python freezing on unexpected CL output with subprocess modulePython 在子进程模块的意外 CL 输出上冻结
【发布时间】:2011-09-03 18:22:35
【问题描述】:

我正在编写一个脚本,通过使用适当的“版本”命令行标志(即--version、-v 等)从命令行程序获取版本号。整个程序使用正则表达式来获取实际的版本号从文本输出中,然后将其与从 xml conf 文件等中提取的最低要求或最高允许版本等各种条件进行比较。

脚本在执行 bzip2 之前运行良好。

对于大多数程序,以下代码没有问题:

args = 'cmd --version'

output = subprocess.getstatusoutput(args)

切得很干。然而!如果您尝试使用 bzip2(到目前为止这是我遇到问题的唯一程序)ala 'bzip2 --version' python "freezes" 并且您必须 ctrl-C 才能在没有记录输出的情况下中断当然。

我尝试了各种变化,例如走长途,即:

import subprocess
from subprocess import PIPE, STDOUT

proc = subprocess.Popen(args, stdout=PIPE, stderr=STDOUT)
while(True):
    code = proc.poll()
    if(code is not None):
        break
    line = proc.stdout.readline() # or even read()
    etc.

无论我使用哪种方法来提取相关文本,Python 总是在某个点后挂起。我在某些时候尝试过 .kill() 来阻止锁定事件,但无济于事。

我认为这只是 bzip2,因为出于某种原因它仍然期待带有 --version 标志的输入。

有什么想法吗?

【问题讨论】:

  • @Foon - 我安装了 Python 2.7.1 和 3.2 版本(全新安装 fc15)。我的 bzip2 版本是 1.0.6。我用 Python 2 和 3 逐字尝试了你的代码,我得到了和以前一样的结果;空行,没有提示,必须ctrl-C出来。不知道是不是bzip2版本1.0.6?
  • @lennart-regebro - 我开始认为这是我的 bzip2 (1.0.6) 版本 - 我尝试了你的代码,我遇到了和以前一样的问题。如果我在空白提示符下键入命令,则无论我键入什么都不会发生任何事情。澄清一下,我可以让 bzip2 吐出它的 --version 信息,它只是不返回提示,或者在我的代码的情况下,将其填充到变量中。
  • 我还想补充一点,在提示符下手动运行 'bzip2 --version' 后,它会在版本文本之后打印两行额外的行,这让我相信正在发生其他奇怪的事情:@987654323 @

标签: xml python-3.x version subprocess bzip2


【解决方案1】:

代码:

import subprocess
from subprocess import STDOUT,PIPE

proc = subprocess.Popen(("bunzip2","--version"),stdout=PIPE,stderr=STDOUT)
data = proc.stdout.read()
print data

现在适用于 bzip2 1.0.6(或 bunzip2 1.0.6,但它们是同一个应用程序)。 在我看来,这真的像是 bzip2 中的一个错误...... --version 应该打印版本并退出,而不是尝试读取/写入标准输入。

【讨论】:

  • 嗯。我刚刚尝试在 FC14 机器(具有 bzip2 1.0.6)上运行它,并且看到了与您看到的相同的行为。所以,你不会发疯,否则我们都会发疯。
  • 稍微更新了上面的代码...具体来说,bunzip2 仍然添加了抱怨行,但为您提供了版本信息而不会挂起
  • 另外...如果你用悬挂的版本按 control-D,它会打印出 bzip2 魔法并退出
【解决方案2】:

即使使用 --version,我的 bzip2 也不期待输入,您只需运行命令即可自己轻松测试。

此代码适用于 Python 2.4-3.2:

import subprocess
from subprocess import PIPE, STDOUT

import sys
proc = subprocess.Popen(sys.argv[1:], stdout=PIPE, stderr=STDOUT)
while True:
    line = proc.stdout.readline() # or even read()
    while True:
        line = proc.stdout.readline() # or even read()
        if not line:
            break
        print(line)
    code = proc.poll()
    if(code is not None):
        break

没有任何形式的绞刑。我什至可以用它运行vi foo.py。显然,由于 vi 突然没有可以与之交谈的终端,因此效果不佳,但我没有挂起。像往常一样做:q!。因此,如果您的 bzip2 需要输入,只需输入一些内容,它就会继续。如果这行得通,那就是问题所在。

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2019-04-13
    • 2010-11-19
    • 2013-05-21
    • 1970-01-01
    • 2014-03-09
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多