sys.exit() 终止得太快?

2 投票
4 回答
1108 浏览
提问于 2025-04-17 03:55

我在运行一些代码,最后有一个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/Cexit() 函数来终止进程。

解决办法是让程序正常结束(可以参考其他答案),或者刷新输出流。

6

去掉 sys.exit() 这一行。

如果你是根据 这个链接 上的内容来理解的 (不过这个内容已经改过了),那么暂时把前两句中的“exit”理解为“完成”或者“结束”。

撰写回答