我有一个python脚本,可以从stdin或文件中读取数据。为此,我以下列方式使用fileinput:
for line in fileinput.input(args.path):
read.parseLine(line)
哪个工作正常。但是,在读完这个文件/输入后,我希望能够通过stdin通过stdin询问用户一些额外的输入:
data = raw_input("Please enter your data for port {}: ".format(core.getPort()))
这不起作用,因为raw_input一直遇到EOF。
Please enter your data for port 0: Traceback (most recent call last):
File "app_main.py", line 72, in run_toplevel
File "/usr/local/bin/dvm", line 98, in <module>
data = raw_input("Please enter your data for port {}: ".format(core.getPort()))
EOFError
我尝试使用sys.stdin.seek(0)
来解决此问题但是会返回以下错误:
Traceback (most recent call last):
File "app_main.py", line 72, in run_toplevel
File "/usr/local/bin/dvm", line 88, in <module>
sys.stdin.seek(0)
IOError: [Errno 29] Illegal seek: '<fdopen>'
使用fileinput后有没有办法要求用户输入?
答案 0 :(得分:2)
fileinput
除了sys.stdin
之外没有对sys.stdin
做任何事情(它明确确保不关闭sys.stdin
)。
但您不能将raw_input()
用作sys.stdin
的文件输入和; fileinput
附加到管道,或它连接到用户终端。它不能同时附加到两者。并且stdin
将无限期地从raw_input
读取,除非在某个时刻达到文件结尾。
换句话说,当sys.stdin
未附加到终端时,您无法使用if os.isatty(sys.stdin.fileno()):
# we have a terminal, I can use `raw_input()`
。您可以使用os.isatty()
function来检测终端是否可用:
{{1}}