這是一個很奇怪的例子,它非常普遍,我無法正確縮小搜索條件以找到答案。在使用raw_input()時在bash中保存Python腳本的輸出
我的Python腳本有一個raw_input來提示用戶輸入值。但是,當我嘗試運行腳本並將其轉換爲文件時,它會崩潰。
像「script.py> save.txt」 不會工作。它甚至不會在命令行中正確提示我輸入。似乎沒有任何跡象表明爲什麼這不像它應該那樣直觀地工作。
這是一個很奇怪的例子,它非常普遍,我無法正確縮小搜索條件以找到答案。在使用raw_input()時在bash中保存Python腳本的輸出
我的Python腳本有一個raw_input來提示用戶輸入值。但是,當我嘗試運行腳本並將其轉換爲文件時,它會崩潰。
像「script.py> save.txt」 不會工作。它甚至不會在命令行中正確提示我輸入。似乎沒有任何跡象表明爲什麼這不像它應該那樣直觀地工作。
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
好點,這將會寫入控制終端即使都stdin
和stderr
被重定向。但是,那裏的交易是,如果你沒有在終端上運行,你不能使用它。
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
+1,但爲了完整性,我想補充說,輸出提示到'stderr'不一定是個好主意,以防它被重定向。爲了更加正確,應該打開'/ dev/tty'來完成明確的交互式I/O。但是,在大多數情況下,在同一個程序中避免重定向和交互式I/O可能會更好。 – Dolda2000
它以什麼方式「崩潰」? – Dolda2000
如果您不重定向輸出,它是否按預期工作? –
另外,假設你正在尋找的「提示符」是作爲'raw_input'的參數給出的嗎? – Dolda2000