使用fileinput后使用raw_input

时间:2014-03-05 15:09:22

标签: python python-2.7 stdin

我有一个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后有没有办法要求用户输入?

1 个答案:

答案 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}}