Python 3.4 退出时的导入错误 - Tendo

Import Error on Python 3.4 Exit - Tendo

提问人:Lucas 提问时间:10/17/2015 最后编辑:Lucas 更新时间:8/6/2017 访问量:1595

问:

我之所以使用这个类,是因为它在临时文件上提供了方便的跨平台锁,以抑制多个实例。我将在 cron 调用的一种启动程序上使用文件锁,我只想运行 1 个实例。tendo.singleton.SingleInstance()

在 Linux 和 Windows 上,当 Python 3.4 退出时,它会给出错误(我猜是垃圾清理)。我正在按照建议进行实例化,进入睡眠状态,然后允许退出。我发现文件锁已被删除,但临时文件仍然存在。SingleInstance()

import tendo.singleton
import time

me = tendo.singleton.SingleInstance()
print('waiting')
time.sleep(5)
print('done waiting')

错误在 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

这在 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)

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

那么,这是一个错误吗?还是析构函数的使用不安全?在测试用例中,我很幸运,Python 3.4 设法执行析构函数,并在车库清理 、 和 之前注释掉了导入?还是在真正的修复中删除模块导入?sysosfnctl__del__()

谢谢!

Python python-3.x 方法 析构函数

评论

1赞 thorr18 3/4/2016
对我来说,注释掉导入只会使它在“sys.exit”而不是“import sys”上出错:(
3赞 jedwards 4/4/2016
怀疑你仍然在寻找答案,但对于未来的观众来说,正如你所猜到的,这可能会在对象最终确定期间发生(参见 PEP 442)。垃圾回收器在您尝试使用 sys 模块时已释放它。Fabio (PyDev) 提出了一种使用 weakrefs 回调来__del__终结器的替代方案,我相信这也可以解决这个问题。

答: 暂无答案