如何在Python脚本中接受管道输入和用户提示输入?

如何在Python脚本中接受管道输入和用户提示输入?,python,input,user-input,Python,Input,User Input,我有一个脚本,用于接受从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_num

我有一个脚本,用于接受从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到达
原始输入之前将其解释为关闭,并在读取行时给出一个
EOF:EOF:

[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
[user]$cat nums.txt
2.
3.
4.
5.
[用户]$cat nums.txt | python sample.py
输入一个与输入相乘的数字:Traceback(最近一次呼叫last):
文件“sample.py”,第6行,在
mult=int(原始输入(“输入一个与输入相乘的数字:”)
EOF:读取一行时的EOF
(请不要担心
cat
…这只是一个很小的例子)

我想知道的是,是否有办法将读取sys.stdin和调用
raw_input
分离开来,这样我就可以同时导入数据,然后提示用户输入

更新,通过消除“红鲱鱼”让我更清楚我真正想要的是什么,并添加了对EOFError的追溯


Result@TimPeter的解决方案对我来说很有效,但我不得不将“CON:”改为“/dev/tty”,因为我使用的是UNIX,而不是Windows。

我怀疑你运气不好,至少对于任何跨平台的解决方案。Python对
raw_input()
使用
sys.stdin
,如果调用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没有对终端设备的特殊支持;i、 例如,这是你自己的事。

谢谢,但这是一个我的同事将使用的程序,我不想强迫他们以奇怪的方式调用脚本。好的建议。然后帮你的同事一个忙,给他们一种运行程序的方法——这样它就会工作,他们也不会感到困惑——哈哈;-)说真的,你能想出任何其他的计划,任何种类的,按照你的意愿在这里工作吗?过于新奇本身就令人困惑。即使我选择只接受管道输入的数据,我仍然需要提示用户输入数据。让我编辑一下这个问题,让它更清楚。实际上,程序更复杂,必须提示用户,输入数据取自另一个同事的程序的输出。是的,grep是这样工作的(当然没有提示),我欣赏决心;-)我添加了一个编辑,显示如何在Windows上进行编辑。在Unix-y系统上“应该”更容易,但不知何故,我对此表示怀疑;-)