1

適切な「バージョン」コマンドラインフラグ、つまり--version、-vなどを使用して、コマンドラインプログラムからバージョン番号を取得するスクリプトを作成しています。プログラムは全体として、正規表現を使用してテキストから実際のバージョン番号を取得します出力し、xml conf ファイルなどから取得した最小要件または最大許容バージョンのさまざまな条件と比較します。

スクリプトは、bzip2 を実行するまで完全に機能します。

ほとんどのプログラムでは、次のコードに問題はありません。

args = 'cmd --version'

output = subprocess.getstatusoutput(args)

きれいにカットして乾かします。でも!たとえば、これを bzip2 で試してみると (これまでのところ、私が問題を抱えていた唯一のプログラムです) ala 'bzip2 --version' python が「フリーズ」し、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() を試しましたが、役に立ちませんでした。

何らかの理由で --version フラグを使用した入力がまだ期待されているため、bzip2 だけだと思います。

何かご意見は?

4

2 に答える 2

0

コード:

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はバージョンを出力して終了し、標準入力への読み取り/書き込みを試みません。

于 2011-05-28T01:14:11.483 に答える
0

私の bzip2 は --version を指定しても入力を期待していません。コマンドを実行するだけで簡単にテストできます。

このコードは、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!と、いつものようにかなり vi になります。したがって、bzip2 が入力を期待している場合は、何かを入力するだけで続行されます。これが機能する場合、それが問題です。

于 2011-05-28T11:53:21.357 に答える