私は subprocess モジュールを初めて使用し、他の多くの Web サイト (Stack Overflow を含む) でPython ドキュメントを読んだ後、、、、およびその他の便利なクラスの単純化された例.Popen
を見つけるのに苦労しています。.communicate
多くの場合、例では各クラスが連続して使用されることはなく、単独でのみ使用されます。また、多くの例は の使用など、Linux ベースで["ls", "-l"]
あるため、Windows ユーザーにとっては非常に理解しにくいものになっています。
このモジュールで数時間遊んだ後、私はいくつかの問題に遭遇しました。これは、単純な .exe コマンド ライン プログラムを開いて通信する方法で最もよく説明できます。
たとえば、プログラムの名前が「numbers.exe」で、次の質問をするとします。
>>> Question 1) Choose 1, 2 or 3
>>> Question 2) Choose 4, 5 or 6
>>> You have answered #(Q1) and #(Q2)
>>> *Use these values in an iterative sequence displaying each stage in the iteration*
次に、このプログラムを自動的に操作したいと思います。つまり、python に何もせずに 2 と 6 を入力させたいのですが、それでも質問を出力します。次に、反復を Python で表示できるようにしたいと考えています。
ここでの最初の考慮事項は、次を使用できることです。
from subprocess import Popen, PIPE
numprog = subprocess.call('numbers.exe')
print(numprog.communicate())
ただし、これはプログラムを開くだけで、自分で 2 と 6 を入力する必要があります。プロセスを自動化するにはPopen
、stdin、stdout、および stderr と一緒に を使用する必要があると思います。ここで問題が発生します。入力 (stdin)、出力 (stdout)、およびエラー (stderr) パイプとの通信を開始するには、Popen を使用する必要があることを理解しています。
from subprocess import Popen, PIPE
numcomms = Popen('numbers.exe', stdout=PIPE, stdin=PIPE, stderr=PIPE)
ここからどうするか迷っています。using を使用するnumcomms.stdout.read()
と、プログラムが長引くだけで、numcomms.stdin.write(2)
int 値を使用できないというエラーがスローされます。このnumprog.communicate
クラスでは、自分で値を入力する必要があるようです。
私が見ることができるものから、疑似コードは次のようになります。
>>> Open numbers.exe stdin, stdout and stderr pipes using Popen
>>> Print first question using stdout
>>> Enter "2" using stdin
>>> Print second question using stdout
>>> Enter "6" using stdin
>>> Receive a string saying "You have answered 2 and 6" using stdout
>>> Display the results of each stage of the iteration using stdout
これを書くにはどうすればいいですか?
助けてくれて本当にありがとう、ありがとう!
編集:反復シーケンスの問題を説明するために質問を編集しました。Michael は入力の問題に対する適切な解決策を提案しましたが、繰り返しの結果を印刷するのに問題があります。