![](/img/trans.png)
[英]How do I accept user input on command line for python script instead of prompt
[英]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.