6

これが簡単なpythonの質問であることを願っています。

Pythonインタープリターで次のことを試すと:

>>> import process
>>> def test(cmd):
...   p = subprocess.Popen(cmd)
...
>>> test(['ls', '-l'])

が実行さls -lれますが、新しい >>> プロンプトを表示するには「return」キーを押す必要があります。

ただし、次のことを試すと:

>>> import process
>>> def test(cmd):
...   p = subprocess.Popen(cmd)
...   p.wait()
...
>>> test(['ls', '-l'])

次に、ls -lすぐに >>> プロンプトが表示されて実行されます。

もう 1 つのバリエーション:

>>> import process
>>> def test(cmd):
...   p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
...
>>> test(['ls', '-l'])

これにより、すぐに新しいプロンプトが表示されます。

最後の例は、私が望むものに最も近いものです。私の目標は、子プロセスを起動し、それが終了するのを待ってから、参照することで親プロセスでその標準出力を使用し、標準エラー出力をp.stdout他の方法で出力することです。

現在、私の実際のアプリケーションでは、最後のバージョン は .p = subprocess.Popen(cmd, stdout=subprocess.PIPE)の有無にかかわらずp.wait().

ありがとう、

チャーリー

4

4 に答える 4

8

最初のバリエーションでtest()は、プロセスの開始後すぐに戻りますが、その出力がコンソールに送信される前です。

出力を見ると、出力の直前にプロンプ​​トが表示されますls

>>> test(['ls', '-l'])
>>> total 0                            <----- test() returns, new propmpt
--rw-r--r--    1 foo bar   7 Mar 24 17:38
etc etc

2 番目のバリエーションでtest()は、プロセスが終了するのを待ってから戻ります。

stdout3 番目のバージョンでは、続行するために子プロセスから読み取る必要がある場合があることは正しいです。

于 2009-03-29T03:47:51.917 に答える
7

私は自分の質問に答えたかもしれません。最後のケースでは、プロセスを続行するには p.stdout から明示的に読み取る必要があると思います。

すなわち:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output = p.stdout.readlines()
....

皆さんありがとう

于 2009-03-29T02:35:19.577 に答える
0

これは、Google に永久に ping を送信するコマンドであるため、出力を取得するには手動で終了する必要があります。

os.popen() メソッド呼び出しを完全な subprocess.Popen クラスに変換する手順については、サブプロセスのドキュメントを参照してください。

host = "www.google.com"
command = "ping %s -t"%host

#p = os.popen(command) -- using Popen instead of os.popen() to allow calling terminate()
p = Popen(command, stdout=subprocess.PIPE)

time.sleep(5)
print "term"
p.terminate()
pingResultSoFar = p.communicate()[0] # get what has been printed to standard out so far
print pingResultSoFar
于 2014-08-22T18:17:12.413 に答える