2014-03-05 76 views
1

後我有一個Python腳本,可以閱讀從標準輸入或從文件中的數據。爲了做到這一點,我在下面的方式使用fileinput的raw_input使用使用的FileInput

for line in fileinput.input(args.path): 
    read.parseLine(line) 

工作正常。然而,閱讀本文件/輸入後,我希望能夠讓用戶通過標準輸入一些額外的輸入使用閱讀:

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後,要求用戶輸入?

回答

2

fileinput對除sys.stdin之外的任何內容都不作任何修改(它明確表示確保不會關閉sys.stdin)。

但是您不能使用sys.stdin作爲文件輸入對於raw_input();任一sys.stdin被連接到它被連接到該用戶終端的配管,或。它不能附在兩者上。而fileinput將從stdin讀無限期除非最終的文件在某一點達到。

換句話說,當sys.stdin未附加到終端時,您不能使用raw_input。您可以使用os.isatty() function檢測一個終端可用:

if os.isatty(sys.stdin.fileno()): 
    # we have a terminal, I can use `raw_input()` 
+0

我猜它是不可能在執行時更改標準輸入的目的地是哪裏? – mathsaey

+0

@mathsaey:*目標*是你的腳本。你不能改變來源,不。這一切都是在Python運行之前設置的。 –

+0

好吧,如果stdin綁定到管道,是否有可能以其他方式請求用戶輸入? – mathsaey