将python stdin流更改为Windows控制台输入

时间:2014-12-04 18:30:33

标签: python windows python-3.x input stdin

我想运行一个python 3脚本,通过stdin 手动输入数据给它一个文件。

E.g。我想我想用一行打印输入的内容。名为app.py的脚本看起来像这样:

from sys import stdin

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

然后,我可以通过以下两种方式运行它:

1。将文件作为stdin传递

python app.py < input.txt

2。提示用户输入

python app.py

我的问题是,在两种情况下,读取标准输入后我想提示用户输入一些额外的数据。按照前面提到的例子,它将是:

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控制台输入。我认为如果我能做到这一点,那么两种情况都能正常运作。

1 个答案:

答案 0 :(得分:0)

您可以将两种情况视为相同(忽略差异)。你的脚本只是从stdin读取两行。 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

  

问:我想要的是从文件或控制台读取一些输入(取决于运行应用时使用的参数)。我希望它们总是从控制台读取的其他一些行。

要直接从控制台读取,无论是否从文件重定向stdin,您都可以使用msvcrt.getwch()。请参阅getpass.win_getpass()中的示例用法。

如果您在接受Unicode输入时遇到问题;安装win_unicode_console package。您可以为python安装全局启用它,也可以为特定用户或整个脚本启用它,或者使用win_unicode_console.enable()/.disable()临时启用它。要强制它使用控制台,如果重定向stdin或call ReadConsoleW() yourself (cumbersome),您可以暂时设置sys.stdin=None