web-dev-qa-db-ja.com

Pythonサブプロセスとユーザーインタラクション

私はPython 2.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用です)。ユーザー入力を複数回処理します。

27
Dave Brunker

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

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

行ごとにプロセスと対話することもできます。これをprog.py

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

次のようにして、1行ずつ操作できます。

>>> 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'
28
Mike