Reputation: 3549
I have some test.py file:
class A:
def __init__(self):
print("A init")
def __del__(self):
print("A del")
a = A()
When I run it 10 times (python3 test.py
) it always produces next output:
A init
A del
But if I add sys.exit
call to end of script:
import sys
class A:
def __init__(self):
print("A init")
def __del__(self):
print("A del")
a = A()
sys.exit(-1)
in 5 of 10 cases (randomly) i have
A init
and in second half of cases:
A init
A del
I use Python3.4.3 [MSC v.1600 32 bit] on Windows 7 x64.
So why __del__
method called not every time? Do I need to use some other exit method to pass return code of script and have all destructors guaranteed executed? And one more related question: is it possible to execute destructors on receive SIGTERM or SIGKILL from OS?
Upvotes: 4
Views: 4450
Reputation: 531055
From the documentation:
It is not guaranteed that
__del__()
methods are called for objects that still exist when the interpreter exits.
If you want to ensure that a.__del__
is invoked, you'll have to explicitly delete the instance:
a = A()
del a # Assuming this is the final reference to the object
Upvotes: 5