我有一个脚本,用于接受来自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解释为在它到达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。
答案 0 :(得分:6)
我怀疑你运气不好,至少对于任何一种跨平台的解决方案都是如此。 Python使用sys.stdin
作为raw_input()
,如果你调用Python使sys.stdin
位于管道的接收端,那么Python无法做任何事情来神奇地将sys.stdin
更改为管道输入结束时的终端。
Here's a variant of the question使用特定于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对终端设备没有特殊支持;也就是说,你是为了自己。