2

私は 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 は入力の問題に対する適切な解決策を提案しましたが、繰り返しの結果を印刷するのに問題があります。

4

2 に答える 2

2

問題subprocess.stdin.writeは、Steve Barnes が正しく指摘したように、おそらく整数ではなく文字列を提供する必要があることです。

ただし、単純なケースでは、より簡単な解決策になる可能性があります。メソッドには入力用のcommunicateオプションのパラメーターがあるため、これは機能するはずです。

from subprocess import Popen, PIPE

numcomms = Popen('numbers.exe', stdout=PIPE, stdin=PIPE, stderr=PIPE)
out, err = numcomms.communicate("2\n6\n")

プログラムの出力はout後で行う必要があり、 を使用して簡単に分割できますout.splitlines()

于 2013-07-14T19:14:51.310 に答える
1

subprocess.stdin.write に関するあなたの問題は、プログラムが int ではなく '2\n' などの改行で終了する可能性が高い文字列を期待していることだと思います。

于 2013-07-14T18:52:20.120 に答える