2014-12-04 121 views
1

我想運行一個python 3腳本,通過標準輸入手動輸入數據。將Python標準輸入流更改爲Windows控制檯輸入

E.g.假設我想用一行打印輸入的內容。該腳本,稱爲app.py會是這個樣子:

from sys import stdin 

print("Input says:"+stdin.readline()) 

然後,我可能會在以下兩種方式運行:

1.傳遞一個文件作爲標準輸入

python app.py < input.txt 

2.提示用戶輸入

python app.py 

我的問題是,在這兩種情況下,閱讀stdin我想提示用戶一些額外的數據。繼之前提到的例子那就是:

from sys import stdin 

print("Input says:"+stdin.readline()) 

print("Did you like that? (Yes/No)") 
ans = input() # This line is the issue! 
if(ans == "Yes"): 
    print("You liked it!")  

的註釋行上述完全適用於情況2,但是對於情況1,因爲它試圖從文件中讀取拋出EOFError: EOF when reading a line錯誤。

我想知道,如果在該行之前我可以做類似

sys.stdin = SOMETHING 

SOMETHING表示Windows控制檯輸入。我認爲如果我能做到這一點,那麼這兩種情況都可以正常工作。

+0

您可以通過'win32console' api到達控制檯。 – tdelaney 2014-12-04 19:18:37

+0

嘗試'CON'或'CONIN $'。可能會工作,具體取決於Python用它做什麼。 – 2014-12-04 21:13:34

+0

你的問題不清楚;即使您已將文件作爲「sys.stdin」提供,您仍希望從* console *提示輸入一些內容。 – 2016-07-30 17:37:55

回答

0

你可以考慮兩種情況是相同的(忽略差異)。你的腳本只是從stdin中讀取兩行。標準輸入可以從文件重定向或者它可以連接到控制檯,你的腳本可以工作一樣在很多情況下:

print("Read the first line from stdin", input()) 
answer = input("Did you like that? (Yes/No): ") # read 2nd line 
if answer == "Yes": 
    print("You liked it!") 

executable code example

問:我想要的東西是從文件或從控制檯(取決於當應用程序被運行使用的參數)中讀取一些投入。我希望他們總能從控制檯讀取其他一些行。

要直接從控制檯讀取,無論標準輸入是否從文件重定向,您可以使用msvcrt.getwch()。請參閱getpass.win_getpass()中的示例用法。

如果您在接受Unicode輸入時遇到問題;安裝win_unicode_console package。您可以爲您的Python安裝或特定用戶全局啓用它,或者爲整個腳本啓用它,或者暫時使用win_unicode_console.enable()/.disable()。要強制它使用控制檯,如果標準輸入重定向,您可以暫時設置sys.stdin=Nonecall ReadConsoleW() yourself (cumbersome)

+0

行'answer = input(「你喜歡這個嗎?(是/否):」)'如果我使用一個文件作爲輸入,則拋出一個EOFError。無論如何,這應該發生,因爲它會嘗試從文件讀取輸入! – Sam 2014-12-05 18:21:57

+0

@Sam:你有沒有試過點擊「可執行代碼示例」鏈接?沒有EOFError。你如何看待ideone爲腳本提供輸入? (沒有人鍵入輸入)。 EOFError可能會在文件末尾產生(可移植的代碼應該處理EOFError異常) - 我不知道確切的條件:這是一個很好的問題。我的答案的重點是你應該忽略兩者之間的區別:'cat input | python your_script.py','輸入python your_script.py'並手動提供來自終端/控制檯的輸入(除非你有特定的理由不要忽略它)。 – jfs 2014-12-07 12:33:30

+0

是的,這是因爲stdin同時具有第一行(執行前存在的數據)和應該在運行時由用戶輸入的「Yes」行。基本上,我想要的是將參考sys.stdin從與輸入文件相關的流(不作爲參數!)更改爲與控制檯輸入相關的流。 – Sam 2014-12-08 14:00:48