11

私はこのようなことを試みています

Output.py

print "Hello"

Input.py

greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting

コマンド行で

Output.py | Input.py

ただし、EOFErrorを返します。誰かが私が間違っていることを教えてもらえますか?

ご協力いただきありがとうございます。

編集
パトリックハリントンソリューションは動作しますが、理由はわかりません...

4

3 に答える 3

23

これをWindowsマシンでテストしましたが、Pythonexeを指定すると機能します。

C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py
Give me the greeting. The greeting is: hello

ただし、コマンドを次のように直接実行した場合にも、EOFErrorが発生します。

output.py | input.py 

それがなぜであるか正確にはわかりません。私はまだこれを調査していますが、少なくともこれは今のところ回避策を提供するはずです。これは、.pyファイルに対してファイルハンドラーが呼び出される方法と関係がある可能性があります。

更新:まあ、あなたは何を知っていますか。これは実際にはWindowsのバグのようで、ファイルの関連付けから開始するとstdin/stdoutリダイレクトが正しく機能しない場合があります。したがって、回避策は私とPatrickが指摘したとおりです。「python」がinput.pyを実行するように指定する必要があります。そうしないと、stdoutがoutput.pyからinput.pyのstdinに正しくリダイレ​​クトされません。

参照

http://mail.python.org/pipermail/python-bugs-list/2004-August/024923.html

http://support.microsoft.com/default.aspx?kbid=321788

更新2

この動作を変更し、Windowsパイプをstdin / stdoutリダイレクトで期待どおりに機能させるには、この値をレジストリに追加します(私のボックスでテストし、これが希望どおりに機能することを確認しました)。

  1. レジストリエディタを起動します。
  2. レジストリで次のキーを見つけてクリックします。

    HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer

  3. [編集]メニューで、[値の追加]をクリックし、次のレジストリ値を追加します。

    値の名前:InheritConsoleHandles
    データ型:REG_DWORD
    基数:10進
    値のデータ:1

  4. レジストリエディタを終了します。

于 2009-01-21T20:30:27.183 に答える
4

次のように変更します。

Output.py | python Input.py

出力は次のようになります。

あいさつをください。挨拶は:こんにちは

于 2009-01-21T20:30:46.560 に答える
0

EOFError が発生する理由は次のとおりです (raw_input のドキュメントから)。

次に、関数は入力から行を読み取り、それを文字列に変換 (末尾の改行を削除) して、それを返します。EOF が読み取られると、EOFError が発生します。

http://docs.python.org/library/functions.html?highlight=raw_input#raw_input

sys.stdinを使用することもできます。これは、 read および readlines メソッドを使用できるファイル オブジェクトを提供します。

import sys
for greeting_line in sys.stdin.readlines():
    print "The greeting is:", greeting_line.strip()
于 2009-01-22T01:22:47.173 に答える