如何在 Python 脚本中接受管道输入,然后接受用户提示的输入



我有一个脚本,旨在接受从 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 对终端设备没有特殊支持;也就是说,你只能靠自己。

相关内容

  • 没有找到相关文章

最新更新