2014-08-29 107 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