8

私が抱えている問題は次のとおりです。簡単な例を使用して説明します。ユーザーの操作を必要とする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が何をしているのかわかりません。

4

1 に答える 1

9

電話はcommunicate1回だけです。したがって、すべての入力を一度に渡す必要がありますchild.communicate("1\n1\n")。または、stdinに書き込むこともできます。

child = subprocess.Popen("./test.py", stdin=subprocess.PIPE)         

child.stdin.write("1\n")                                                       
child.stdin.write("1\n")
于 2012-10-19T21:12:46.507 に答える