将Python标准输入流更改为Windows控制台输入

问题描述:

我想运行一个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

你可以考虑两种情况是相同的(忽略差异)。你的脚本只是从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