2016-10-20 36 views
0

使用在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 

回答

1

你有在鏈接的問題的問題正好相反。 -i使python以交互模式讀取腳本(「>>>」和「...」是提示符),並且在交互模式下,您按下return(即輸入空白行)以退出縮進部分。鏈接的問題涉及縮進部分中間的空白行,這使譯員感到困惑。你有相反的結論:你結束一個縮進部分沒有一個空行。在非互動模式下,這非常好,但在交互模式下,這是一個不允許的。

解決方法:或者在縮進部分的末尾添加空行(並且從不在中間),請不要讓解釋器以交互模式讀取它。我不知道你實際上試圖與-i標誌來完成,但要注意python -i test.py(無重定向)將運行在非交互模式的腳本,然後進入交互模式,從標準輸入讀取。

+0

絕對。而已。通過添加-i標誌,我試圖模擬Django shell的工作方式,即始終以'python -i'模式無法關閉它。這也回答了爲什麼過去某個時間有效的問題。如果你的輸入腳本沒有縮進部分,或者縮進部分恰好以空行結束(這在我編寫python代碼時很常見),那麼就沒有語法錯誤。 – nmgeek

相關問題