sys.exit()终止得太快了?

时间:2011-10-08 01:22:42

标签: python google-app-engine

我正在运行一些带有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 :(得分:6)

删除sys.exit()

如果你的基础是http://code.google.com/appengine/docs/python/runtime.html#Responses (已经改写过)中的措辞,那么假装前两句中使用“退出”意味着“完成”或“完成”。

答案 1 :(得分:1)

正如其他人已经给出了很好的解决方案,我会试着解释为什么会这样。

SystemExit引发的sys.exit()例外与其他例外情况的区别在于一种特殊方式。如果未捕获,则sys.excepthook 不会被调用。相反,在打印其中包含的消息并提取退出原因后,Python将关闭(Py_Finalize)并调用终止该过程的ANSI/C函数exit()

解决方案是让流程正常结束(请参阅其他答案)或刷新流。

答案 2 :(得分: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中的一个错误;您可能想要提交错误报告。 (OTOH,你真的不应该在GAE中使用sys.exit(),因为那时你不清楚你的main()函数是否可以重新运行。)

答案 3 :(得分:0)

尝试在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))
self.response.out.flush()
sys.exit()