我想运行一个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控制台输入。我认为如果我能做到这一点,那么两种情况都能正常运作。
答案 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!")
问:我想要的是从文件或控制台读取一些输入(取决于运行应用时使用的参数)。我希望它们总是从控制台读取的其他一些行。
要直接从控制台读取,无论是否从文件重定向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
。