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

当我从标准输入管道输入数据时,python 在标准输入到达之前将其解释为已关闭,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。

4

1 回答 1

6

我怀疑你不走运,至少对于任何类型的跨平台解决方案。Python 使用sys.stdinfor 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对终端设备没有特殊支持;即,您只能靠自己。

于 2013-10-04T03:36:00.863 回答