我有一个脚本,旨在接受从 stdin 传入的输入,然后提示用户输入更多输入。这是一个人为的例子来说明我的意思:
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 之前将 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的解决方案对我有用,但我不得不将"CON:"更改为"/dev/tty",因为我使用的是UNIX,而不是Windows。
我怀疑你不走运,至少对于任何类型的跨平台解决方案。 Python使用sys.stdin
表示raw_input()
,如果你调用Python,使sys.stdin
在管道的接收端,那么当管道输入结束时,Python无法做任何事情来神奇地将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 对终端设备没有特殊支持;也就是说,你只能靠自己。