python关于脚本卸载事件(析构函数)

发布于 2024-12-22 02:04:11 字数 245 浏览 1 评论 0原文

我在 python 脚本中使用文件锁定(以控制其执行的单个实例)。 http://code.google.com/p/pylockfile/ 我释放了finally代码块中的锁。 但是,如果脚本关闭,例如关闭运行它的终端,则finally块不会执行并且文件保持锁定状态。

在任何情况下如何捕获 python 脚本析构函数事件?

I am using file locking in python script (to control single instance of it execution).
http://code.google.com/p/pylockfile/
I release lock in finally code block.
But if script closed, for example, closing the terminal running it, the finally block doesn't execute and the file stays locked.

How to catch python script destructor event in any case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

盛装女皇 2024-12-29 02:04:11

请参阅此博文关于这个主题。在 Windows 下它使用 win32api,而在 Linux 下则捕获 SIGTERM 信号。要验证其工作情况,在 on_exit 处理程序中向文件中写入一些内容可能会有所帮助,如下所示。由于该片段非常简短,我将仅包含它(完全支持博客作者):

import os, sys
def set_exit_handler(func):
    if os.name == "nt":
        try:
            import win32api
            win32api.SetConsoleCtrlHandler(func, True)
        except ImportError:
            version = '.'.join(map(str, sys.version_info[:2]))
            raise Exception('pywin32 not installed for Python ' + version)
    else:
        import signal
        signal.signal(signal.SIGTERM, func)

if __name__ == '__main__':
    def on_exit(sig, func=None):
        f = open('log.txt', 'w')
        f.write('shutdown...')
        f.close()
        sys.exit()
    set_exit_handler(on_exit)
    print 'Press  to quit'
    raw_input()
    print 'quit!'

如果您将关闭运行该程序的终端,它将创建一个文件来验证回调功能。

See this blog post regarding this subject. It uses the win32api when under Windows, while under Linux the SIGTERM signal is caught. To verify its working, it might be helpful to write something to a file in the on_exit handler like as done below. As the snippet is quite brief, I'll just include it (full props to the blog author):

import os, sys
def set_exit_handler(func):
    if os.name == "nt":
        try:
            import win32api
            win32api.SetConsoleCtrlHandler(func, True)
        except ImportError:
            version = '.'.join(map(str, sys.version_info[:2]))
            raise Exception('pywin32 not installed for Python ' + version)
    else:
        import signal
        signal.signal(signal.SIGTERM, func)

if __name__ == '__main__':
    def on_exit(sig, func=None):
        f = open('log.txt', 'w')
        f.write('shutdown...')
        f.close()
        sys.exit()
    set_exit_handler(on_exit)
    print 'Press  to quit'
    raw_input()
    print 'quit!'

If you will close the terminal running that program, it will create a file to verify the callback functionality.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文