使python cgi脚本优雅地完成

时间:2009-05-20 07:44:15

标签: python cgi

我有一个python cgi脚本,接受用户上传(通过sys.stdin.read)。 收到文件后(无论是成功还是失败),脚本需要进行一些清理。这在上传正确完成时工作正常,但是如果用户关闭客户端,则cgi脚本在服务器上被静默杀死,因此不会执行清理代码。如何强制脚本始终完成。

3 个答案:

答案 0 :(得分:1)

您可以使用信号模块捕获退出信号。虽然没有尝试使用mod_python。

http://docs.python.org/library/signal.html

在文档中注意:

  

当信号在I / O操作期间到达时,I / O操作可能会在信号处理程序返回后引发异常。这取决于底层Unix系统关于中断系统调用的语义。

如果您没有从处理程序中进行sys.exit,则可能需要捕获损坏的管道和/或文件写入的I / O异常。

答案 1 :(得分:1)

剧本可能没有被默默杀死;你只是没有看到python引发的异常。我建议将整个脚本包装在try-except中,并将任何异常写入日志文件。

这样,你可以看到真正发生的事情。 logging模块是您的朋友。

答案 2 :(得分:0)

您可以使用atexit模块。

http://docs.python.org/library/atexit.html

来自文档:

  

atexit模块定义了一个用于注册清理功能的函数。这样注册的函数在正常的解释器终止时自动执行。

     

注意:当程序被信号杀死,检测到Python致命内部错误或调用os._exit()时,不会调用通过此模块注册的函数。

     

这是sys.exitfunc变量提供的功能的备用接口。