You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.4 KiB
145 lines
4.4 KiB
"""
|
|
Autotest tempfile wrapper for mkstemp (known as tempfile here) and
|
|
mkdtemp (known as tempdir).
|
|
|
|
This wrapper provides a mechanism to clean up temporary files/dirs once they
|
|
are no longer need.
|
|
|
|
Files/Dirs will have a unique_id prepended to the suffix and a
|
|
_autotmp_ tag appended to the prefix.
|
|
|
|
It is required that the unique_id param is supplied when a temp dir/file is
|
|
created.
|
|
"""
|
|
|
|
import shutil, os, logging
|
|
import tempfile as module_tempfile
|
|
|
|
_TEMPLATE = '_autotmp_'
|
|
|
|
|
|
class tempfile(object):
|
|
"""
|
|
A wrapper for tempfile.mkstemp
|
|
|
|
@param unique_id: required, a unique string to help identify what
|
|
part of code created the tempfile.
|
|
@param auto_clean: automatically delete the temporary file in destructor.
|
|
@var name: The name of the temporary file.
|
|
@var fd: the file descriptor of the temporary file that was created.
|
|
@return a tempfile object
|
|
example usage:
|
|
t = autotemp.tempfile(unique_id='fig')
|
|
t.name # name of file
|
|
t.fd # file descriptor
|
|
t.fo # file object
|
|
t.clean() # clean up after yourself
|
|
"""
|
|
def __init__(self, unique_id, suffix='', prefix='', dir=None,
|
|
text=False, auto_clean=True):
|
|
self.auto_clean = auto_clean
|
|
suffix = unique_id + suffix
|
|
prefix = prefix + _TEMPLATE
|
|
self.fd, self.name = module_tempfile.mkstemp(suffix=suffix,
|
|
prefix=prefix,
|
|
dir=dir, text=text)
|
|
self.fo = os.fdopen(self.fd)
|
|
|
|
|
|
def clean(self):
|
|
"""
|
|
Remove the temporary file that was created.
|
|
This is also called by the destructor.
|
|
"""
|
|
if self.fo:
|
|
self.fo.close()
|
|
if self.name and os.path.exists(self.name):
|
|
os.remove(self.name)
|
|
|
|
self.fd = self.fo = self.name = None
|
|
|
|
|
|
def __del__(self):
|
|
try:
|
|
if self.name is not None and self.auto_clean:
|
|
logging.debug('Auto-cleaning %s', self.name)
|
|
self.clean()
|
|
except:
|
|
try:
|
|
msg = 'An exception occurred while calling the destructor'
|
|
logging.exception(msg)
|
|
except:
|
|
pass
|
|
|
|
|
|
class tempdir(object):
|
|
"""
|
|
A wrapper for tempfile.mkdtemp
|
|
|
|
@var name: The name of the temporary dir.
|
|
@return A tempdir object
|
|
example usage:
|
|
b = autotemp.tempdir(unique_id='exemdir')
|
|
b.name # your directory
|
|
b.clean() # clean up after yourself
|
|
"""
|
|
def __init__(self, suffix='', unique_id='', prefix='', dir=None,
|
|
auto_clean=True):
|
|
"""
|
|
Initialize temp directory.
|
|
|
|
@param suffix: suffix for dir.
|
|
@param prefix: prefix for dir. Defaults to '_autotmp'.
|
|
@param unique_id: unique id of tempdir.
|
|
@param dir: parent directory of the tempdir. Defaults to /tmp.
|
|
@param auto_clean: automatically clean up the tempdir in destructor.
|
|
|
|
eg: autotemp.tempdir(suffix='suffix', unique_id='123', prefix='prefix')
|
|
creates a dir like '/tmp/prefix_autotmp_<random hash>123suffix'
|
|
"""
|
|
self.auto_clean = auto_clean
|
|
suffix = unique_id + suffix
|
|
prefix = prefix + _TEMPLATE
|
|
self.name = module_tempfile.mkdtemp(suffix=suffix,
|
|
prefix=prefix, dir=dir)
|
|
|
|
|
|
def clean(self):
|
|
"""
|
|
Remove the temporary dir that was created.
|
|
This is also called by the destructor.
|
|
"""
|
|
if self.name and os.path.exists(self.name):
|
|
shutil.rmtree(self.name)
|
|
|
|
self.name = None
|
|
|
|
|
|
def __del__(self):
|
|
try:
|
|
if self.name and self.auto_clean:
|
|
logging.debug('Auto-cleaning %s', self.name)
|
|
self.clean()
|
|
except:
|
|
try:
|
|
msg = 'An exception occurred while calling the destructor'
|
|
logging.exception(msg)
|
|
except:
|
|
pass
|
|
|
|
|
|
class dummy_dir(object):
|
|
"""A dummy object representing a directory with a name.
|
|
|
|
Only used for compat with the tmpdir, in cases where we wish to
|
|
reuse a dir with the same interface but not to delete it after
|
|
we're done using it.
|
|
"""
|
|
|
|
def __init__(self, name):
|
|
"""Initialize the dummy_dir object.
|
|
|
|
@param name: Path the the directory.
|
|
"""
|
|
self.name = name
|