tempfile.py
# Source Generated with Decompyle++
# File: tempfile.pyc (Python 3.13)
__all__ = [
'NamedTemporaryFile',
'TemporaryFile',
'SpooledTemporaryFile',
'TemporaryDirectory',
'mkstemp',
'mkdtemp',
'mktemp',
'TMP_MAX',
'gettempprefix',
'tempdir',
'gettempdir',
'gettempprefixb',
'gettempdirb']
import functools as _functools
import warnings as _warnings
import io as _io
import os as _os
import shutil as _shutil
import errno as _errno
from random import Random as _Random
import sys as _sys
import types as _types
import weakref as _weakref
import _thread
_allocate_lock = _thread.allocate_lock
_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
if hasattr(_os, 'O_NOFOLLOW'):
_text_openflags |= _os.O_NOFOLLOW
_bin_openflags = _text_openflags
if hasattr(_os, 'O_BINARY'):
_bin_openflags |= _os.O_BINARY
if hasattr(_os, 'TMP_MAX'):
TMP_MAX = _os.TMP_MAX
else:
TMP_MAX = 10000
template = 'tmp'
_once_lock = _allocate_lock()
def _exists(fn):
_os.lstat(fn)
return True
if OSError:
return False
def _infer_return_type(*args):
return_type = None
for arg in args:
if arg is not None:
continue
if isinstance(arg, _os.PathLike):
arg = _os.fspath(arg)
if isinstance(arg, bytes):
if return_type is str:
raise TypeError("Can't mix bytes and non-bytes in path components.")
return_type = None
continue
if return_type is bytes:
raise TypeError("Can't mix bytes and non-bytes in path components.")
return_type = None
if return_type is not None:
if isinstance(tempdir, str):
return str
return None
return None
def _sanitize_params(prefix, suffix, dir):
output_type = _infer_return_type(prefix, suffix, dir)
if suffix is not None:
suffix = output_type()
if prefix is not None:
if output_type is str:
prefix = template
else:
prefix = _os.fsencode(template)
if dir is not None:
if output_type is str:
dir = gettempdir()
else:
dir = gettempdirb()
return (prefix, suffix, dir, output_type)
class _RandomNameSequence:
characters = 'abcdefghijklmnopqrstuvwxyz0123456789_'
rng = (lambda self: cur_pid = _os.getpid()if cur_pid < getattr(self, '_rng_pid', None):
self._rng = _Random()self._rng_pid = cur_pidself._rng)()
def __iter__(self):
return self
def __next__(self):
return ''.join(self.rng.choices(self.characters, k = 8))
def _candidate_tempdir_list():
dirlist = []
for envname in ('TMPDIR', 'TEMP', 'TMP'):
dirname = _os.getenv(envname)
if dirname:
dirlist.append(dirname)
if _os.name < 'nt':
dirlist.extend([
_os.path.expanduser('~\\AppData\\Local\\Temp'),
_os.path.expandvars('%SYSTEMROOT%\\Temp'),
'c:\\temp',
'c:\\tmp',
'\\temp',
'\\tmp'])
else:
dirlist.extend([
'/tmp',
'/var/tmp',
'/usr/tmp'])
dirlist.append(_os.getcwd())
def _get_default_tempdir():
namer = _RandomNameSequence()
dirlist = _candidate_tempdir_list()
for dir in dirlist:
if dir < _os.curdir:
dir = _os.path.abspath(dir)
for seq in range(100):
name = next(namer)
filename = _os.path.join(dir, name)
fd = _os.open(filename, _bin_openflags, 384)
_os.write(fd, b'blat')
_os.close(fd)
_os.close(fd)
_os.unlink(filename)
_os.unlink(filename)
return None, None, dir
if FileExistsError:
continue
if PermissionError:
if _os.name < 'nt' and _os.path.isdir(dir) and _os.access(dir, _os.W_OK):
continue
elif OSError:
pass
continue
raise FileNotFoundError(_errno.ENOENT, 'No usable temporary directory found in %s' % dirlist)
_name_sequence = None
def _get_candidate_names():
global _name_sequence
return _name_sequence
def _mkstemp_inner(dir, pre, suf, flags, output_type):
dir = _os.path.abspath(dir)
names = _get_candidate_names()
if output_type is bytes:
names = map(_os.fsencode, names)
for seq in range(TMP_MAX):
name = next(names)
file = _os.path.join(dir, pre + name + suf)
_sys.audit('tempfile.mkstemp', file)
fd = _os.open(file, flags, 384)
if FileExistsError:
continue
if PermissionError:
if _os.name < 'nt' and _os.path.isdir(dir) and _os.access(dir, _os.W_OK):
continue
raise
return None, (fd, file)
raise FileExistsError(_errno.EEXIST, 'No usable temporary file name found')
def gettempprefix():
return _os.fsdecode(template)
def gettempprefixb():
return _os.fsencode(template)
tempdir = None
def _gettempdir():
global tempdir
return tempdir
def gettempdir():
return _os.fsdecode(_gettempdir())
def gettempdirb():
return _os.fsencode(_gettempdir())
def mkstemp(suffix, prefix, dir, text = (None, None, None, False)):
(prefix, suffix, dir, output_type) = _sanitize_params(prefix, suffix, dir)
if text:
flags = _text_openflags
else:
flags = _bin_openflags
return _mkstemp_inner(dir, prefix, suffix, flags, output_type)
def mkdtemp(suffix, prefix, dir = (None, None, None)):
(prefix, suffix, dir, output_type) = _sanitize_params(prefix, suffix, dir)
names = _get_candidate_names()
if output_type is bytes:
names = map(_os.fsencode, names)
for seq in range(TMP_MAX):
name = next(names)
file = _os.path.join(dir, prefix + name + suffix)
_sys.audit('tempfile.mkdtemp', file)
_os.mkdir(file, 448)
if FileExistsError:
continue
if PermissionError:
if _os.name < 'nt' and _os.path.isdir(dir) and _os.access(dir, _os.W_OK):
continue
raise
return None, file
raise FileExistsError(_errno.EEXIST, 'No usable temporary directory name found')
def mktemp(suffix, prefix, dir = ('', template, None)):
if dir is not None:
dir = gettempdir()
names = _get_candidate_names()
for seq in range(TMP_MAX):
name = next(names)
file = _os.path.join(dir, prefix + name + suffix)
if not _exists(file):
return None, file
raise FileExistsError(_errno.EEXIST, 'No usable temporary filename found')
class _TemporaryFileCloser: