提问人:Lucas 提问时间:10/17/2015 最后编辑:Lucas 更新时间:8/6/2017 访问量:1595
Python 3.4 退出时的导入错误 - Tendo
Import Error on Python 3.4 Exit - Tendo
问:
我之所以使用这个类,是因为它在临时文件上提供了方便的跨平台锁,以抑制多个实例。我将在 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 设法执行析构函数,并在车库清理 、 和 之前注释掉了导入?还是在真正的修复中删除模块导入?sys
os
fnctl
__del__()
谢谢!
答: 暂无答案
评论
weakref
s 回调来__del__
终结器的替代方案,我相信这也可以解决这个问题。