Python 3.4退出时导入错误 - Tendo

Luc*_*cas 6 python methods destructor class python-3.x

我已经使用了tendo.singleton.SingleInstance()该类,因为它为临时文件提供了方便的跨平台锁定以禁止多个实例.我将在cron调用的一个类型的启动程序上使用文件锁,我只想运行一个实例.

在Linux和Windows上,它在Python 3.4退出时会出错(我想是垃圾清理).我SingleInstance()按照建议实例化,睡觉,然后允许退出.我发现文件锁已被删除,但临时文件仍然存在.

import tendo.singleton
import time

me = tendo.singleton.SingleInstance()
print('waiting')
time.sleep(5)
print('done waiting')
Run Code Online (Sandbox Code Playgroud)

在Windows 7上出现类似的错误,类似于Linux.

Exception ignored in: <bound method SingleInstance.__del__ of <tendo.singleton.SingleInstance object at 0x000000000251DC50>>
Traceback (most recent call last):
  File "C:\Anaconda3\envs\py34\lib\site-packages\tendo\singleton.py", line 63, in __del__
ImportError: import of 'sys' halted; None in sys.modules
Run Code Online (Sandbox Code Playgroud)

这在Python 2.7中不会发生.

仔细看看课堂上的__del__()方法SingleInstace(),我发现有进口:

def __del__(self):
    import sys
    import os
    if not self.initialized:
        return
    try:
        if sys.platform == 'win32':
            if hasattr(self, 'fd'):
                os.close(self.fd)
                os.unlink(self.lockfile)
        else:
            import fcntl
            fcntl.lockf(self.fp, fcntl.LOCK_UN)
            # os.close(self.fp)
            if os.path.isfile(self.lockfile):
                os.unlink(self.lockfile)
    except Exception as e:
        if logger:
            logger.warning(e)
        else:
            print("Unloggable error: %s" % e)
        sys.exit(-1)
Run Code Online (Sandbox Code Playgroud)

如果我注释掉这些导入(因为它们已经被导入singleton.py),那么__del__()析构函数按预期工作.

那么,这是一个错误吗?或者析构函数的使用是不安全的?我只是幸运的测试用例的Python 3.4管理执行与进口的析构函数的车库清理之前注释掉sys,osfnctl?或者是__del__()在真正的修复中删除模块导入?

谢谢!