我试图在一个类中包装一个写得不好的Python模块(我无法控制)。问题是如果我没有明确地调用该模块的关闭函数,那么python进程会在退出时挂起,所以我试图用一个具有 del的类来包装模块方法,但似乎没有在异常上调用 del 方法。
示例:
class Test(object):
def __init__(self):
# Initialize the problematic module here
print "Initializing"
def __del__(self):
# Close the problematic module here
print "Closing"
t = Test()
# This raises an exception
moo()
在这种情况下,不会调用 del 并且python挂起。每当对象超出范围时,我都需要以某种方式强制Python立即调用 del (比如C ++)。 请注意,我无法控制有问题的模块(即无法修复导致此问题的错误),也无法控制使用包装类的人(不能强制他们使用"使用& #34;因此我无法使用退出。
有没有合适的方法来解决这个问题?
谢谢!
答案 0 :(得分:2)
如果您希望在异常时释放某些资源,请考虑__enter__ + __exit__范例。
class Test(object):
def __enter__(self):
pass
def __exit__(self):
pass # Release your resources here
with Test() as t:
moo()
执行进入''阻止,方法__enter __()' t'被调用,然后由于正常流或异常而离开块,方法__exit __()由于' t'被称为。
答案 1 :(得分:0)
一个可能的解决方案是使用sys.excepthook,它允许您向全局异常处理程序引入自定义登录。您可以在其中添加一些代码以关闭模块的剩菜。
答案 2 :(得分:0)
请在下面找到详细信息:
class Test:
def __init__(self):
print('cons')
def __del__(self):
print('des')
如果我们在某个全局dict中添加Test类的对象,并在完成功能后清除该dict。它将调用析构函数
ctx = {}
def a():
ctx['ao'] = Test()
raise 1/0
a()
# cons
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "<stdin>", line 3, in a
# ZeroDivisionError: integer division or modulo by zero
如果我们释放ctx的旧内容并分配新值,则将调用析构函数
ctx = {}
# des