10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""Temporary files. 20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThis module provides generic, low- and high-level interfaces for 40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yicreating temporary files and directories. The interfaces listed 50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yias "safe" just below can be used without fear of race conditions. 60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThose listed as "unsafe" cannot, and are provided for backward 70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yicompatibility only. 80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThis module also provides some data items to the user: 100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi TMP_MAX - maximum number of names that will be tried before 120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi giving up. 130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi template - the default prefix for all temporary names. 140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi You may change this to control the default prefix. 150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tempdir - If this is set to a string before the first use of 160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi any routine from this module, it will be considered as 170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi another candidate location to store temporary files. 180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi""" 190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi__all__ = [ 210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces 220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "SpooledTemporaryFile", 230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "mkstemp", "mkdtemp", # low level safe interfaces 240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "mktemp", # deprecated unsafe interface 250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "TMP_MAX", "gettempprefix", # constants 260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "tempdir", "gettempdir" 270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ] 280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Imports. 310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport io as _io 330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os as _os 340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport errno as _errno 350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom random import Random as _Random 360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry: 380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi from cStringIO import StringIO as _StringIO 390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError: 400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi from StringIO import StringIO as _StringIO 410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry: 430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import fcntl as _fcntl 440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError: 450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _set_cloexec(fd): 460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse: 480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _set_cloexec(fd): 490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0) 510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except IOError: 520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # flags read successfully, modify 550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags |= _fcntl.FD_CLOEXEC 560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _fcntl.fcntl(fd, _fcntl.F_SETFD, flags) 570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry: 600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import thread as _thread 610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError: 620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import dummy_thread as _thread 630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_allocate_lock = _thread.allocate_lock 640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL 660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, 'O_NOINHERIT'): 670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _text_openflags |= _os.O_NOINHERIT 680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, 'O_NOFOLLOW'): 690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _text_openflags |= _os.O_NOFOLLOW 700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_bin_openflags = _text_openflags 720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, 'O_BINARY'): 730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _bin_openflags |= _os.O_BINARY 740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, 'TMP_MAX'): 760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi TMP_MAX = _os.TMP_MAX 770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse: 780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi TMP_MAX = 10000 790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitemplate = "tmp" 810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Internal routines. 830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_once_lock = _allocate_lock() 850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, "lstat"): 870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _stat = _os.lstat 880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielif hasattr(_os, "stat"): 890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _stat = _os.stat 900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse: 910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Fallback. All we need is something that raises os.error if the 920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # file doesn't exist. 930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _stat(fn): 940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = open(fn) 960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except IOError: 970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise _os.error 980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _exists(fn): 1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _stat(fn) 1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except _os.error: 1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return False 1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return True 1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass _RandomNameSequence: 1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """An instance of _RandomNameSequence generates an endless 1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sequence of unpredictable strings which can safely be incorporated 1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi into file names. Each string is six characters long. Multiple 1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi threads can safely use the same instance at the same time. 1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _RandomNameSequence is an iterator.""" 1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi characters = ("abcdefghijklmnopqrstuvwxyz" + 1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + 1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "0123456789_") 1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.mutex = _allocate_lock() 1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.normcase = _os.path.normcase 1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @property 1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def rng(self): 1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cur_pid = _os.getpid() 1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if cur_pid != getattr(self, '_rng_pid', None): 1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._rng = _Random() 1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._rng_pid = cur_pid 1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._rng 1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __iter__(self): 1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self 1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def next(self): 1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = self.mutex 1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = self.characters 1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi choose = self.rng.choice 1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m.acquire() 1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi letters = [choose(c) for dummy in "123456"] 1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m.release() 1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.normcase(''.join(letters)) 1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _candidate_tempdir_list(): 1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Generate a list of candidate temporary directories which 1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _get_default_tempdir will try.""" 1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirlist = [] 1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # First, try the environment. 1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for envname in 'TMPDIR', 'TEMP', 'TMP': 1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirname = _os.getenv(envname) 1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dirname: dirlist.append(dirname) 1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Failing that, try OS-specific locations. 1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if _os.name == 'riscos': 1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirname = _os.getenv('Wimp$ScrapDir') 1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dirname: dirlist.append(dirname) 1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi elif _os.name == 'nt': 1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ]) 1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ]) 1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # As a last resort, the current directory. 1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirlist.append(_os.getcwd()) 1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (AttributeError, _os.error): 1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirlist.append(_os.curdir) 1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return dirlist 1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _get_default_tempdir(): 1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Calculate the default directory to use for temporary files. 1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi This routine should be called exactly once. 1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi We determine whether or not a candidate temp dir is usable by 1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi trying to create and write to a file in that directory. If this 1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi is successful, the test file is deleted. To prevent denial of 1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi service, the name of the test file must be randomized.""" 1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi namer = _RandomNameSequence() 1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirlist = _candidate_tempdir_list() 1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags = _text_openflags 1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for dir in dirlist: 1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir != _os.curdir: 1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = _os.path.normcase(_os.path.abspath(dir)) 1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Try only a few names per directory. 1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for seq in xrange(100): 1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = namer.next() 1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi filename = _os.path.join(dir, name) 1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fd = _os.open(filename, flags, 0o600) 1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with _io.open(fd, 'wb', closefd=False) as fp: 2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fp.write(b'blat') 2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _os.close(fd) 2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _os.unlink(filename) 2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return dir 2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (OSError, IOError) as e: 2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if e.args[0] != _errno.EEXIST: 2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi break # no point trying more names in this directory 2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise IOError, (_errno.ENOENT, 2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("No usable temporary directory found in %s" % dirlist)) 2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_name_sequence = None 2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _get_candidate_names(): 2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Common setup sequence for all user-callable interfaces.""" 2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi global _name_sequence 2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if _name_sequence is None: 2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _once_lock.acquire() 2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if _name_sequence is None: 2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _name_sequence = _RandomNameSequence() 2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _once_lock.release() 2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return _name_sequence 2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _mkstemp_inner(dir, pre, suf, flags): 2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile.""" 2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi names = _get_candidate_names() 2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for seq in xrange(TMP_MAX): 2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = names.next() 2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = _os.path.join(dir, pre + name + suf) 2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fd = _os.open(file, flags, 0600) 2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _set_cloexec(fd) 2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return (fd, _os.path.abspath(file)) 2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except OSError, e: 2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if e.errno == _errno.EEXIST: 2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi continue # try again 2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise 2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise IOError, (_errno.EEXIST, "No usable temporary file name found") 2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# User visible interfaces. 2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef gettempprefix(): 2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Accessor for tempdir.template.""" 2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return template 2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitempdir = None 2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef gettempdir(): 2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Accessor for tempfile.tempdir.""" 2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi global tempdir 2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if tempdir is None: 2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _once_lock.acquire() 2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if tempdir is None: 2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tempdir = _get_default_tempdir() 2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _once_lock.release() 2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return tempdir 2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef mkstemp(suffix="", prefix=template, dir=None, text=False): 2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """User-callable function to create and return a unique temporary 2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file. The return value is a pair (fd, name) where fd is the 2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file descriptor returned by os.open, and name is the filename. 2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi If 'suffix' is specified, the file name will end with that suffix, 2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi otherwise there will be no suffix. 2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi If 'prefix' is specified, the file name will begin with that prefix, 2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi otherwise a default prefix is used. 2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi If 'dir' is specified, the file will be created in that directory, 2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi otherwise a default directory is used. 2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi If 'text' is specified and true, the file is opened in text 2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi mode. Else (the default) the file is opened in binary mode. On 2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi some operating systems, this makes no difference. 2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi The file is readable and writable only by the creating user ID. 2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi If the operating system uses permission bits to indicate whether a 2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file is executable, the file is executable by no one. The file 2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi descriptor is not inherited by children of this process. 2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Caller is responsible for deleting the file when done with it. 2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = gettempdir() 2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if text: 3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags = _text_openflags 3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags = _bin_openflags 3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return _mkstemp_inner(dir, prefix, suffix, flags) 3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef mkdtemp(suffix="", prefix=template, dir=None): 3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """User-callable function to create and return a unique temporary 3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi directory. The return value is the pathname of the directory. 3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Arguments are as for mkstemp, except that the 'text' argument is 3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi not accepted. 3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi The directory is readable, writable, and searchable only by the 3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi creating user. 3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Caller is responsible for deleting the directory when done with it. 3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = gettempdir() 3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi names = _get_candidate_names() 3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for seq in xrange(TMP_MAX): 3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = names.next() 3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = _os.path.join(dir, prefix + name + suffix) 3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _os.mkdir(file, 0700) 3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return file 3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except OSError, e: 3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if e.errno == _errno.EEXIST: 3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi continue # try again 3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise 3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise IOError, (_errno.EEXIST, "No usable temporary directory name found") 3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef mktemp(suffix="", prefix=template, dir=None): 3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """User-callable function to return a unique temporary file name. The 3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file is not created. 3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Arguments are as for mkstemp, except that the 'text' argument is 3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi not accepted. 3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi This function is unsafe and should not be used. The file name 3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi refers to a file that did not exist at some point, but by the time 3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi you get around to creating it, someone else may have beaten you to 3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi the punch. 3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## from warnings import warn as _warn 3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## _warn("mktemp is a potential security risk to your program", 3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## RuntimeWarning, stacklevel=2) 3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = gettempdir() 3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi names = _get_candidate_names() 3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for seq in xrange(TMP_MAX): 3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = names.next() 3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = _os.path.join(dir, prefix + name + suffix) 3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not _exists(file): 3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return file 3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise IOError, (_errno.EEXIST, "No usable temporary filename found") 3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass _TemporaryFileWrapper: 3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Temporary file wrapper 3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi This class provides a wrapper around files opened for 3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi temporary use. In particular, it seeks to automatically 3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi remove the file when it is no longer needed. 3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, file, name, delete=True): 3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.file = file 3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.name = name 3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.close_called = False 3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.delete = delete 3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattr__(self, name): 3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Attribute lookups are delegated to the underlying file 3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # and cached for non-numeric results 3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # (i.e. methods are cached, closed and friends are not) 3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = self.__dict__['file'] 3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = getattr(file, name) 3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not issubclass(type(a), type(0)): 3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(self, name, a) 3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return a 3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # The underlying __enter__ method returns the wrong object 3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # (self.file) so override it to return the wrapper 3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __enter__(self): 3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.file.__enter__() 3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self 3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # NT provides delete-on-close as a primitive, so we don't need 3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # the wrapper to do anything special. We still use it so that 4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile. 4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if _os.name != 'nt': 4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Cache the unlinker so we don't get spurious errors at 4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # shutdown when the module-level "os" is None'd out. Note 4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # that this must be referenced as self.unlink, because the 4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # name TemporaryFileWrapper may also get None'd out before 4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # __del__ is called. 4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unlink = _os.unlink 4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def close(self): 4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not self.close_called: 4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.close_called = True 4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.file.close() 4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self.delete: 4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unlink(self.name) 4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.close() 4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Need to trap __exit__ as well to ensure the file gets 4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # deleted when used in a with statement 4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __exit__(self, exc, value, tb): 4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi result = self.file.__exit__(exc, value, tb) 4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.close() 4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return result 4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __exit__(self, exc, value, tb): 4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.file.__exit__(exc, value, tb) 4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="", 4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi prefix=template, dir=None, delete=True): 4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Create and return a temporary file. 4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Arguments: 4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'prefix', 'suffix', 'dir' -- as for mkstemp. 4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'mode' -- the mode argument to os.fdopen (default "w+b"). 4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'bufsize' -- the buffer size argument to os.fdopen (default -1). 4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'delete' -- whether the file is deleted on close (default True). 4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi The file is created as mkstemp() would do it. 4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Returns an object with a file-like interface; the name of the file 4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi is accessible as file.name. The file will be automatically deleted 4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi when it is closed unless the 'delete' argument is set to False. 4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = gettempdir() 4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if 'b' in mode: 4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags = _bin_openflags 4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags = _text_openflags 4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Setting O_TEMPORARY in the flags causes the OS to delete 4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # the file when it is closed. This is only supported by Windows. 4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if _os.name == 'nt' and delete: 4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags |= _os.O_TEMPORARY 4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) 4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = _os.fdopen(fd, mode, bufsize) 4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return _TemporaryFileWrapper(file, name, delete) 4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif _os.name != 'posix' or _os.sys.platform == 'cygwin': 4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # On non-POSIX and Cygwin systems, assume that we cannot unlink a file 4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # while it is open. 4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi TemporaryFile = NamedTemporaryFile 4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse: 4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def TemporaryFile(mode='w+b', bufsize=-1, suffix="", 4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi prefix=template, dir=None): 4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Create and return a temporary file. 4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Arguments: 4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'prefix', 'suffix', 'dir' -- as for mkstemp. 4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'mode' -- the mode argument to os.fdopen (default "w+b"). 4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'bufsize' -- the buffer size argument to os.fdopen (default -1). 4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi The file is created as mkstemp() would do it. 4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Returns an object with a file-like interface. The file has no 4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name, and will cease to exist when it is closed. 4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = gettempdir() 4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if 'b' in mode: 4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags = _bin_openflags 4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi flags = _text_openflags 4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) 4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _os.unlink(name) 4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return _os.fdopen(fd, mode, bufsize) 4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _os.close(fd) 4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise 4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass SpooledTemporaryFile: 4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Temporary file wrapper, specialized to switch from 4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi StringIO to a real file when it exceeds a certain size or 5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi when a fileno is needed. 5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _rolled = False 5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, max_size=0, mode='w+b', bufsize=-1, 5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi suffix="", prefix=template, dir=None): 5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._file = _StringIO() 5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._max_size = max_size 5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._rolled = False 5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir) 5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _check(self, file): 5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self._rolled: return 5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi max_size = self._max_size 5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if max_size and file.tell() > max_size: 5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.rollover() 5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def rollover(self): 5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self._rolled: return 5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = self._file 5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi newfile = self._file = TemporaryFile(*self._TemporaryFileArgs) 5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del self._TemporaryFileArgs 5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi newfile.write(file.getvalue()) 5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi newfile.seek(file.tell(), 0) 5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._rolled = True 5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # The method caching trick from NamedTemporaryFile 5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # won't work here, because _file may change from a 5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _StringIO instance to a real file. So we list 5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # all the methods directly. 5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Context management protocol 5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __enter__(self): 5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self._file.closed: 5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise ValueError("Cannot enter context with closed file") 5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self 5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __exit__(self, exc, value, tb): 5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._file.close() 5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # file protocol 5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __iter__(self): 5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.__iter__() 5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def close(self): 5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._file.close() 5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @property 5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def closed(self): 5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.closed 5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def fileno(self): 5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.rollover() 5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.fileno() 5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def flush(self): 5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._file.flush() 5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def isatty(self): 5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.isatty() 5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @property 5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mode(self): 5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.mode 5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._TemporaryFileArgs[0] 5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @property 5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def name(self): 5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.name 5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return None 5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def next(self): 5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.next 5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def read(self, *args): 5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.read(*args) 5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def readline(self, *args): 5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.readline(*args) 5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def readlines(self, *args): 5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.readlines(*args) 5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def seek(self, *args): 5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._file.seek(*args) 5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @property 5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def softspace(self): 5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.softspace 5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def tell(self): 5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.tell() 5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def truncate(self): 6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._file.truncate() 6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def write(self, s): 6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = self._file 6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi rv = file.write(s) 6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._check(file) 6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return rv 6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def writelines(self, iterable): 6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = self._file 6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi rv = file.writelines(iterable) 6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._check(file) 6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return rv 6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def xreadlines(self, *args): 6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._file.xreadlines(*args) 6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return iter(self._file.readlines(*args)) 619