5

標準入力からパイプされた入力を受け入れ、ユーザーにさらに入力を求めるように設計されたスクリプトがあります。これは、私が何を意味するかを示す不自然な例です。

import sys

# Get input from stdin
input_nums = [int(n.strip()) for n in sys.stdin]

# Prompt user
mult = int(raw_input("Enter a number by which to multiply your input: "))

for num in input_nums:
    print num*mult

stdin からデータをパイプすると、python は stdin が到達する前に閉じていると解釈し、次raw_inputのようになりますEOFError: EOF when reading a line

[user]$ cat nums.txt
2
3
4
5
[user]$ cat nums.txt | python sample.py
Enter a number by which to multiply your input: Traceback (most recent call last):
  File "sample.py", line 6, in <module>
    mult = int(raw_input("Enter a number by which to multiply your input: "))
EOFError: EOF when reading a line

(無駄な使用について心配しないでくださいcat...これは最小限の例です)

私が知りたいのは、sys.stdin の読み取りと呼び出しを何らかの方法で分離してraw_input、データをパイプで送り、ユーザーに入力を促す方法があるかどうかです。

赤いニシンを排除することで、本当に欲しいものをより明確にするために更新し、EOFError のトレースバックを追加しました。

結果@TimPeter のソリューションはうまくいきましたが、Windows ではなく UNIX を使用しているため、「CON:」を「/dev/tty」に変更する必要がありました。

4

1 に答える 1

6

少なくともあらゆる種類のクロスプラットフォーム ソリューションについては、運が悪いのではないかと思います。Python はsys.stdinfor を使用し、パイプの受信側でraw_input()Python を呼び出した場合、Pythonはパイプ入力が終了したときにsys.stdin魔法のように端末に変更することはできません。sys.stdin

これは、受け入れられた回答としてUnix固有の回避策を備えた質問の変形です。これは、プログラムの呼び出し方法を変更することで、問題の一部 (すべてではない) を巧みに回避します。

ごめん。

一方通行

これは Windows では問題なく動作するようです:

import sys
print len(sys.stdin.read()) # anything to consume piped input
sys.stdin = open("CON:", "r")
x = raw_input("sdfklj ")

つまり、パイプインされた入力を読み取った後、読み取りモードで開かれsys.stdinた特別なファイルCON:(Windows では DOS ボックスと呼ばれるもの) に再バインドされます。

そこで何を試すかについては、Unix ドキュメントを参照してください/dev/tty1。プラットフォームの仕様によっては、いじる必要がある端末制御オプションが山ほどあります。そのため、(最初に) クロスプラットフォーム ソリューションは運が悪いと思いますと言いました。Python は端末デバイスを特別にサポートしていません。つまり、あなたはそのために自分でいます。

于 2013-10-04T03:36:00.863 に答える