私が抱えている問題は次のとおりです。簡単な例を使用して説明します。ユーザーの操作を必要とするPythonスクリプトを作成しました。具体的には、raw_input()関数を使用してユーザーの入力を取得します。以下のコードは、ユーザーに2つの数字を連続して入力するように要求し(それぞれの間にEnterキーを押す)、答えを返します(驚き、驚き、「sum_two_numbers.py」と呼ばれます)。ほんと!
#! /usr/bin/python
# -------------------
# sum_two_numbers.py
# -------------------
# This script asks the user for two numbers and returns the sum!
a = float(raw_input("Enter the first number:"))
b = float(raw_input("Enter the second number:"))
print a+b
ここで、上記のスクリプトを実行し、それに必要な2つの数値を「フィード」する別のPythonスクリプトを作成します。したがって、このスクリプトを「feeder.py」と呼びます。Pythonの「サブプロセス」モジュールを使用して、特に「Popen」クラスとそれに関連する「communicate」メソッドを使用して、このスクリプトを作成しようとしました。以下は、数字「5」と「4」をフィードしようとするスクリプトです。
#! /usr/bin/python
# ----------
# feeder.py
# ----------
import subprocess
child = subprocess.Popen("./sum_two_numbers.py",stdin=subprocess.PIPE)
child.communicate("5")
child.communicate("4")
このコードは機能せず、実行時にエラーを返します。
$ ./feeder.py
Enter the first number:Enter the second number:Traceback (most recent call last):
File "./sum_two_numbers.py", line 6, in <module>
b = float(raw_input("Enter the second number:"))
EOFError: EOF when reading a line
Traceback (most recent call last):
File "./feeder.py", line 8, in <module>
child.communicate("4")
File "/usr/lib/python2.7/subprocess.py", line 740, in communicate
self.stdin.write(input)
ValueError: I/O operation on closed file
'feeder.py'を記述して、必要な処理を実行する方法がわかりません。これらのエラーが原因で、引き続き問題が発生します。このエラーは、ドキュメントの次のコメントが原因で発生していると思われます。
Popen.communicate(input = None)
プロセスとの対話:データをstdinに送信します。ファイルの終わりに達するまで、stdoutおよびstderrからデータを読み取ります。プロセスが終了するのを待ちます。
この文章をどうすればいいのか、それがどのように役立つのかわかりません...
誰かが上記のスクリプトを機能させるのを手伝ってくれますか?つまり、サブプロセスとPopenを適切に使用する方法...または「フィーダー」スクリプトを(あまり曖昧ではない)言語で書く方法です!Pexpect、Expectを試しましたが、子コードの入力要求が出力されないなどの問題が発生しました。一般的に、Pexpectが何をしているのかわかりません。