使用在Ubuntu Linux和Python 2.7.6 bash shell中,如果我運行下面用命令的python腳本,語法錯誤時重定向到標準輸入
python test.py
我得到這樣的輸出:
outer
inner
2
如果我,而是使用類似這樣的標準輸入重定向,
python -i < test.py
的輸出,
>>> outer
>>> >>> ... ... ... File "<stdin>", line 4
print i
^
SyntaxError: invalid syntax
>>>
因此,顯然,我不應該在shell重定向時使用-i選項,即在命令中使用'<'字符。這種組合顯然導致了對空白的一些操作,在python分析輸入時,這是一個python語法錯誤。
不幸的是,我在Django python shell中運行python腳本時遇到了同樣的問題,並且運行Django python shell的命令沒有辦法禁用交互式python模式,也無法傳遞python腳本文件的名稱。
此外,我相信這可以在同一個Linux機器上的不同Linux或更早的版本上運行,所以我想知道是否有一些環境設置可以修復它。
有沒有辦法改變的Python的交互模式的行爲,或有沒有辦法在Django的殼禁用交互模式,所以我可以不假語法錯誤,運行一般的Python腳本?或者我只是在Django或python的一個錯誤?
順便說一句,這個問題聽起來很像在https://stackoverflow.com/a/13703413/2950621描述的問題,但接受的答案說要改變劇本空行。然而我的腳本沒有空行。
python腳本如下。 (我把它寫的標誌是不執行縮進的行時):
print 'outer'
i = 1
if True:
print 'inner'
i = 2
print i
我想有些讀者可能會懷疑一個隱藏的性格是難辭其咎的。這裏是八進制轉儲,所以你可以看到有什麼,但你看到的上面(甚至不是一個標籤):
$ od -a test.py
0000000 p r i n t sp ' o u t e r ' nl i sp
0000020 = sp 1 nl i f sp T r u e : nl sp p r
0000040 i n t sp ' i n n e r ' nl sp i sp =
0000060 sp 2 nl p r i n t sp i nl
絕對。而已。通過添加-i標誌,我試圖模擬Django shell的工作方式,即始終以'python -i'模式無法關閉它。這也回答了爲什麼過去某個時間有效的問題。如果你的輸入腳本沒有縮進部分,或者縮進部分恰好以空行結束(這在我編寫python代碼時很常見),那麼就沒有語法錯誤。 – nmgeek