制作python cgi脚本以优雅地完成

制作python cgi脚本以优雅地完成,python,cgi,Python,Cgi,我有一个python cgi脚本,它接受用户上传(通过sys.stdin.read)。 收到文件后(无论成功与否),脚本需要进行一些清理。当上传正确完成时,这可以正常工作,但是如果用户关闭客户端,cgi脚本将在服务器上被静默地终止,因此不会执行任何清理代码。如何强制脚本始终完成。您可以使用信号模块捕获退出信号。不过,我还没有用mod_python尝试过这一点 在文件中注意: 当信号在I/O操作期间到达时,I/O操作可能在信号处理程序返回后引发异常。这取决于底层Unix系统关于中断系统调用的语义

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

您可以使用信号模块捕获退出信号。不过,我还没有用mod_python尝试过这一点

在文件中注意:

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


如果不从处理程序sys.exit退出,您可能需要捕获断开管道和/或文件写入的I/O异常。

脚本可能不会自动终止;您只是看不到python抛出的异常。我建议将整个脚本包装在
try except
中,并将任何异常写入日志文件


这样,你就可以看到真正发生了什么。
日志记录模块是您的朋友。

您可以使用atexit模块

从文件中:

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

注意:当程序被信号终止、检测到Python致命内部错误或调用os.\u exit()时,不会调用通过此模块注册的函数

这是sys.exitfunc变量提供的功能的替代接口


如果OP以CGI脚本的形式运行脚本,这里就不会涉及mod_python。当客户端关闭时——套接字最终超时——您应该会得到某种类型的I/O错误。