sys.exit() 终止得太快?
我在运行一些代码,最后有一个sys.exit()的调用。如果没有这个sys.exit(),self.response就能正常工作并渲染模板。但是当我调用sys.exit()时,页面却变成空白。感觉就像sys.exit()在模板渲染过程中给打断了。为什么会这样呢?
page = 'index.html'
template_values = {}
path = os.path.join(os.path.dirname(__file__), page)
self.response.out.write(template.render(path, template_values))
sys.exit()
补充 我通过用“return”代替“sys.exit()”解决了我的问题。
4 个回答
0
另外,你可以捕捉 SystemExit
并正常返回:
def main():
try:
...
except SystemExit, e:
# return normally for exit() or exit(0). Otherwise, reraise.
if e.args and e.args[0]:
raise
稍微扩展一下:
之所以不管用,是因为你的 Python 脚本并不是像“正常”的 CGI 那样运行——它有一个异常捕捉的包装器,还有其他一些东西,而 sys.exit() 是通过抛出一个异常来实现的(这个异常并不属于 Exception() 类,所以默认情况下不会被捕捉到)。
我认为这是 GAE 的一个 bug;你可能想要提交一个 bug 报告。不过,另一方面,你真的不应该在 GAE 中使用 sys.exit(),因为那样就不清楚你的 main() 函数是否可以重新运行。
1
其他人已经给出了很好的解决方案,我来解释一下为什么会发生这种情况。
通过 sys.exit()
引发的 SystemExit
异常和其他异常有一个特别的不同之处。如果这个异常没有被捕获,sys.excepthook
不会 被调用。相反,Python 会打印出异常中的信息,并提取退出原因,然后关闭程序(Py_Finalize
),最后调用 ANSI/C
的 exit()
函数来终止进程。
解决办法是让程序正常结束(可以参考其他答案),或者刷新输出流。
6
去掉 sys.exit()
这一行。
如果你是根据 这个链接 上的内容来理解的 (不过这个内容已经改过了),那么暂时把前两句中的“exit”理解为“完成”或者“结束”。