2016-02-26 88 views
1

這是一個很奇怪的例子,它非常普遍,我無法正確縮小搜索條件以找到答案。在使用raw_input()時在bash中保存Python腳本的輸出

我的Python腳本有一個raw_input來提示用戶輸入值。但是,當我嘗試運行腳本並將其轉換爲文件時,它會崩潰。

像「script.py> save.txt」 不會工作。它甚至不會在命令行中正確提示我輸入。似乎沒有任何跡象表明爲什麼這不像它應該那樣直觀地工作。

+0

它以什麼方式「崩潰」? – Dolda2000

+0

如果您不重定向輸出,它是否按預期工作? –

+0

另外,假設你正在尋找的「提示符」是作爲'raw_input'的參數給出的嗎? – Dolda2000

回答

3

raw_output將其提示輸出到stdout,您將其重定向到文件。所以你的提示最終會在文件中出現,程序不會顯示提示。一種解決方法是將您的提示輸出到stderr

import sys 

sys.stderr.write('prompt> ') 
value = raw_input() 
print('value was: ', value) 

您還可以避免在同一腳本中同時使用管道和交互式輸入。可以使用​​從命令行標誌獲取輸入並使用管道,或者創建一個將輸出保存到文件本身的交互式程序。

根據你的程序的邏輯,你也可以檢查stdout是否連接到實時控制檯或不:

is_tty = os.isatty(sys.stdout.fileno()) 

Dolda2000也有關於寫入/dev/tty好點,這將會寫入控制終端即使stdinstderr被重定向。但是,那裏的交易是,如果你沒有在終端上運行,你不能使用它。

import errno 
try: 
    with open('/dev/tty', 'w') as tty: 
     tty.write('prompt> ') 
except IOError as exc: 
    if exc.errno == errno.ENXIO: 
     pass # no /dev/tty available 
    else: 
     pass # something else went wrong 
+2

+1,但爲了完整性,我想補充說,輸出提示到'stderr'不一定是個好主意,以防它被重定向。爲了更加正確,應該打開'/ dev/tty'來完成明確的交互式I/O。但是,在大多數情況下,在同一個程序中避免重定向和交互式I/O可能會更好。 – Dolda2000