簡體   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