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,os和fnctl?或者是__del__()在真正的修复中删除模块导入?
谢谢!