编写一个优雅结束的Python CGI脚本
我有一个用Python写的CGI脚本,可以接受用户上传的文件(通过sys.stdin.read)。在接收到文件后,不管上传成功与否,这个脚本都需要进行一些清理工作。当上传正常完成时,这些清理工作都能顺利进行。但是,如果用户在上传过程中关闭了客户端,CGI脚本会在服务器上被悄悄终止,这样清理的代码就不会执行了。我该怎么做才能确保这个脚本总是能完成呢?
3 个回答
0
你可以试试使用 atexit 模块。
http://docs.python.org/library/atexit.html
根据文档的说明:
atexit 模块提供了一个功能,可以用来注册清理函数。这样注册的函数会在正常结束解释器时自动执行。
注意:通过这个模块注册的函数在程序被信号杀死、检测到 Python 的致命内部错误,或者调用 os._exit() 时不会被调用。
这个模块是 sys.exitfunc 变量提供的功能的另一种接口。
1
这个脚本可能并没有被悄悄杀掉;你只是看不到Python抛出的错误。我建议把整个脚本放在try-except
里,这样可以把任何错误写入一个日志文件。
这样一来,你就能看到实际发生了什么。logging
模块会对你很有帮助。
1
你可以使用signal模块来捕捉退出信号。不过,我还没有在mod_python中尝试过这个。
http://docs.python.org/library/signal.html
在文档中注意到:
当一个信号在进行输入/输出操作时到达,有可能在信号处理程序返回后,输入/输出操作会引发一个异常。这取决于底层Unix系统对被中断的系统调用的处理方式。
如果你没有在处理程序中使用sys.exit,可能需要捕捉输入/输出异常,比如断开的管道或文件写入错误。