I am creating a class in which I want to generate a temporary workspace of folders that will persist for the life of the object and then be removed. I am using tempfile.mkdtemp() in the def init to create the space, but I have read that I can't rely on del being called.
I am wanting something like this:
self.tempfolder = tempfile.mkdtemp()
def ... #other stuff
if os.path.exists(self.tempfolder): shutil.rmtree(self.tempfolder)
Caveat: you can never guarantee that the temp folder will be deleted, because the user could always hard kill your process and then it can't run anything else.
That said, do
temp_dir = tempfile.mkdtemp() try: <some code> finally: shutil.rmtree(temp_dir)
Since this is a very common operation, Python has a special way to encapsulate "do something, execute code, clean up": a context manager. You can write your own as follows:
@contextlib.contextmanager def make_temp_directory(): temp_dir = tempfile.mkdtemp() try: yield temp_dir finally: shutil.rmtree(temp_dir)
and use it as
with make_temp_directory() as temp_dir: <some code>
(Note that this uses the
@contextlib.contextmanager shortcut to make a context manager. If you want to implement one the original way, you need to make a custom class with
__exit__ methods; the
__enter__ would create and return the temp directory and the
__exit__ delete it.