Python冻结了带有子流程模块的意外CL输出

问题描述

| 我正在编写一个脚本,以使用相应的\'version \'命令行标志(例如--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标志输入。 有什么想法吗?     

解决方法

        即使使用--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突然没有与之对话的终端,但是我没有挂上。照ѭ4。照常会很vi。因此,如果您的bzip2需要输入,只需输入一些内容,它将继续。如果这可行,那就是问题所在。     ,        代码:
import subprocess
from subprocess import STDOUT,PIPE

proc = subprocess.Popen((\"bunzip2\",\"--version\"),stderr=STDOUT)
data = proc.stdout.read()
print data
现在可用于bzip2 1.0.6(或bunzip2 1.0.6,但它们是同一应用程序)。 对我来说,那真的像是bzip2中的错误……--version应该打印版本并退出,而不是尝试对stdin进行读/写。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...