2014-08-29 139 views
0

我正在編寫一個腳本,其中包括打印10秒倒計時而不換行,並且我希望它與Python2和Python3兼容。捕捉語法錯誤

這是我已經試過:

for sec in range(10, 0, -1): 
    try: 
     print(" %d \r" % sec, end="") 
    except SyntaxError: 
     subprocess.call("printf \" %d \\r\"" % sec, shell=True) 

    time.sleep(1) 

而且我得到這個錯誤:

print(" %d \r" % sec, end="") 
          ^
SyntaxError: invalid syntax 

在我看來,那SyntaxError應該被逮住。

我試過研究這個主題,並閱讀documentation on SyntaxError,但找不到任何暗示爲什麼會發生這種情況。

+1

語法錯誤並不是你可以捕捉到的異常,這意味着整個程序是不合格的。現在,我猜你正在運行Python 2.x,其中'print'不是支持關鍵字參數的函數。嘗試升級或從__future__導入printf_function'。 – 2014-08-29 05:25:02

回答

2

由於文件說:

This may occur in an import statement, in an exec statement, in a call to the built-in function eval() or input(), or when reading the initial script or standard input (also interactively).

讀你的程序的時候,你的任何代碼被執行之前,整個文件的語法解析。如果語法無效,Python甚至無法開始運行代碼。所以你不能捕獲模塊內部發生的SyntaxError。

對於這種特殊情況,有替代方案,即from __future__ import print_function

+0

不幸的是,我試過了,它會一直等到倒計時完成,然後再打印所有數字,就像我在'python2'中執行'print(...)'一樣。因此,爲什麼我在'printf'中使用'subprocess'。 – 2014-08-29 05:27:41

+1

@JohnB:這可能是一個緩衝問題。看[這個問題](http://stackoverflow.com/questions/107705/python-output-buffering)。 – BrenBarn 2014-08-29 05:36:42

+0

謝謝,你回答了這個問題。但是,似乎文件可能更清楚。畢竟,它確實會說'這可能發生在閱讀最初的腳本時'。此外,您鏈接的問題中的解決方案適用於我的腳本。 – 2014-08-29 05:53:21

0

這應該對你有所幫助。

from __future__ import print_function 

import time; 

for sec in range(2): 
    print(sec, end='') 
    time.sleep(1) 
+0

這等到循環的最後一次迭代打印所有內容。 – 2014-08-29 05:33:58

+1

這似乎是一個緩衝問題。使用-u作爲python解釋器的參數解決了這個問題。但是在2.x和3.x之間仍然存在一些不一致。 – 2014-08-29 06:29:15