tempdir.py
59 lines
| 1.8 KiB
| text/x-python
|
PythonLexer
Srinivas Reddy Thatiparthy
|
r23288 | """ This module contains classes - NamedFileInTemporaryDirectory, TemporaryWorkingDirectory. | ||
Srinivas Reddy Thatiparthy
|
r23701 | These classes add extra features such as creating a named file in temporary directory and | ||
Srinivas Reddy Thatiparthy
|
r23288 | creating a context manager for the working directory which is also temporary. | ||
""" | ||||
Min RK
|
r21102 | import os as _os | ||
Jakub Klus
|
r26192 | from pathlib import Path | ||
Srinivas Reddy Thatiparthy
|
r23287 | from tempfile import TemporaryDirectory | ||
Min RK
|
r21102 | |||
Srinivas Reddy Thatiparthy
|
r23701 | |||
Min RK
|
r21102 | class NamedFileInTemporaryDirectory(object): | ||
Matthias Bussonnier
|
r27509 | def __init__(self, filename, mode="w+b", bufsize=-1, add_to_syspath=False, **kwds): | ||
Min RK
|
r21102 | """ | ||
Open a file named `filename` in a temporary directory. | ||||
This context manager is preferred over `NamedTemporaryFile` in | ||||
stdlib `tempfile` when one needs to reopen the file. | ||||
Arguments `mode` and `bufsize` are passed to `open`. | ||||
Rest of the arguments are passed to `TemporaryDirectory`. | ||||
""" | ||||
self._tmpdir = TemporaryDirectory(**kwds) | ||||
Jakub Klus
|
r26192 | path = Path(self._tmpdir.name) / filename | ||
gousaiyang
|
r27495 | encoding = None if "b" in mode else "utf-8" | ||
gousaiyang
|
r27494 | self.file = open(path, mode, bufsize, encoding=encoding) | ||
Min RK
|
r21102 | |||
def cleanup(self): | ||||
self.file.close() | ||||
self._tmpdir.cleanup() | ||||
__del__ = cleanup | ||||
def __enter__(self): | ||||
return self.file | ||||
def __exit__(self, type, value, traceback): | ||||
self.cleanup() | ||||
class TemporaryWorkingDirectory(TemporaryDirectory): | ||||
""" | ||||
Creates a temporary directory and sets the cwd to that directory. | ||||
Automatically reverts to previous cwd upon cleanup. | ||||
Usage example: | ||||
with TemporaryWorkingDirectory() as tmpdir: | ||||
... | ||||
""" | ||||
Matthias Bussonnier
|
r27747 | |||
Min RK
|
r21102 | def __enter__(self): | ||
Jakub Klus
|
r26192 | self.old_wd = Path.cwd() | ||
Min RK
|
r21102 | _os.chdir(self.name) | ||
return super(TemporaryWorkingDirectory, self).__enter__() | ||||
def __exit__(self, exc, value, tb): | ||||
_os.chdir(self.old_wd) | ||||
return super(TemporaryWorkingDirectory, self).__exit__(exc, value, tb) | ||||