繁体   English   中英

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

[英]How do I accept piped input and then user-prompted input in a Python script?

我有一个脚本,旨在接受来自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它给出了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对终端设备没有特殊支持; 也就是说,你自己就是这样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM