37

私はPython2.6でGUIフロントエンドに取り組んでおり、通常はかなり単純です。subprocess.call()またはを使用subprocess.Popen()してコマンドを発行し、コマンドが終了するかエラーに反応するのを待ちます。ユーザーの操作を停止して待機するプログラムがある場合はどうしますか?たとえば、プログラムが停止し、ユーザーにIDとパスワード、またはエラーの処理方法を尋ねる場合があります。

c:\> parrot
Military Macaw - OK
Sun Conure - OK
African Grey - OK
Norwegian Blue - Customer complaint!
(r) he's Resting, (h) [Hit cage] he moved, (p) he's Pining for the fjords

これまで読んだことはすべて、プログラムの実行中に出力を処理する方法ではなく、プログラムが終了した後にのみプログラムからすべての出力を読み取る方法を示しています。新しいモジュールをインストールできません(これはLiveCD用です)。ユーザー入力を複数回処理します。

4

1 に答える 1

40

サブプロセスのマニュアルを確認してください。呼び出しているプロセスの、、およびを独自のsubprocessものにリダイレクトできるオプションがあります。stdinstdoutstderr

from subprocess import Popen, PIPE, STDOUT

p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

grep_stdout = p.communicate(input='one\ntwo\nthree\nfour\nfive\nsix\n')[0]
print grep_stdout

プロセスを 1 行ずつ操作することもできます。これを次のように考えるとprog.py

import sys
print 'what is your name?'
sys.stdout.flush()
name = raw_input()
print 'your name is ' + name
sys.stdout.flush()

次の方法で行ごとに操作できます。

>>> from subprocess import Popen, PIPE, STDOUT
>>> p = Popen(['python', 'prog.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
>>> p.stdout.readline().rstrip()
'what is your name'
>>> p.communicate('mike')[0].rstrip()
'your name is mike'

編集: python3 では、'mike'.encode().

于 2013-01-22T12:49:29.147 に答える