我正在运行一些带有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()”解决了我的问题
答案 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()