2011-10-08 62 views
2

我正在运行一些代码,并在最后使用sys.exit()调用。如果没有sys.exit()行,self.response就可以正常工作并呈现模板。但是当我调用sys.exit()时,页面返回空白。这几乎就像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() 

编辑我用 “回归” 解决我的问题,而不是 “sys.exit()”

+1

我怀疑Python的[内部]缓冲在这里响应 - flush应该做的伎俩。另请参阅:http://stackoverflow.com/questions/107705/python-output-buffering(很高兴看到一个答案,为什么一个方法[说没有'sys.exit']“工作”,而另一个不; Python终止的区别是什么?) – 2011-10-08 01:26:34

+1

你不应该在App Engine上调用sys.exit。 –

回答

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()函数是否可以重新运行。)

+0

这不是一个错误,因为你不应该首先从App Engine中调用退出。 –

+0

@NickJohnson:如果它是特殊的* App Engine *导致此失败(即如果if __name__ ==“__main__”:sys.stdout.write(“Status:200 OK \ nContent-Type:text/plain \ n \ nGoodbye,Cruel World“); sys.exit();'失败),那么它就是一个App Engine错误,因为App Engine应该为您提供类似CGI的环境。但是,它实际上可能是Web框架的一个属性,它可能不是一个错误。 –

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() 
1

由于其他人已经给出了很好的解决方案,我会尽力解释为什么发生这种情况。

sys.exit()引起的SystemExit异常不同于其他例外以一种特殊方式。如果没有发现,sys.excepthook不是叫。相反,在打印其中包含的消息并提取退出原因后,Python会关闭(Py_Finalize)并调用ANSI/C函数exit(),该函数会终止该进程。

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