blob: 6bc842f6d82a188e37ee2a7423d17181d81eea7b [file] [log] [blame]
Guido van Rossum0e548712002-08-09 16:14:33 +00001"""Temporary files.
Guido van Rossume7b146f2000-02-04 15:28:42 +00002
Guido van Rossum0e548712002-08-09 16:14:33 +00003This module provides generic, low- and high-level interfaces for
4creating temporary files and directories. The interfaces listed
5as "safe" just below can be used without fear of race conditions.
6Those listed as "unsafe" cannot, and are provided for backward
7compatibility only.
Guido van Rossumeee94981991-11-12 15:38:08 +00008
Guido van Rossum0e548712002-08-09 16:14:33 +00009This module also provides some data items to the user:
Guido van Rossumeee94981991-11-12 15:38:08 +000010
Guido van Rossum0e548712002-08-09 16:14:33 +000011 TMP_MAX - maximum number of names that will be tried before
12 giving up.
Guido van Rossum0e548712002-08-09 16:14:33 +000013 tempdir - If this is set to a string before the first use of
14 any routine from this module, it will be considered as
15 another candidate location to store temporary files.
16"""
Skip Montanaro40fc1602001-03-01 04:27:19 +000017
Guido van Rossum0e548712002-08-09 16:14:33 +000018__all__ = [
19 "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
Nick Coghlan543af752010-10-24 11:23:25 +000020 "SpooledTemporaryFile", "TemporaryDirectory",
Guido van Rossum0e548712002-08-09 16:14:33 +000021 "mkstemp", "mkdtemp", # low level safe interfaces
22 "mktemp", # deprecated unsafe interface
23 "TMP_MAX", "gettempprefix", # constants
24 "tempdir", "gettempdir"
25 ]
Guido van Rossum41f95031992-03-31 19:02:01 +000026
Tim Peters4fd5a062002-01-28 23:11:23 +000027
Guido van Rossum0e548712002-08-09 16:14:33 +000028# Imports.
Tim Peters4fd5a062002-01-28 23:11:23 +000029
Serhiy Storchaka99e033b2014-01-27 11:18:27 +020030import atexit as _atexit
Antoine Pitrou17c93262013-12-21 22:14:56 +010031import functools as _functools
Nick Coghlan6b22f3f2010-12-12 15:24:21 +000032import warnings as _warnings
Guido van Rossum9a634702007-07-09 10:24:45 +000033import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000034import os as _os
Serhiy Storchaka99e033b2014-01-27 11:18:27 +020035import shutil as _shutil
Serhiy Storchaka7451a722013-02-09 22:25:49 +020036import errno as _errno
Guido van Rossum0e548712002-08-09 16:14:33 +000037from random import Random as _Random
38
Guido van Rossumd8faa362007-04-27 19:54:29 +000039try:
Guido van Rossum0e548712002-08-09 16:14:33 +000040 import fcntl as _fcntl
Tim Peters90ee7eb2004-07-18 23:58:17 +000041except ImportError:
Tim Peters291f14e2003-07-22 02:50:01 +000042 def _set_cloexec(fd):
43 pass
44else:
Guido van Rossum0e548712002-08-09 16:14:33 +000045 def _set_cloexec(fd):
Tim Peters90ee7eb2004-07-18 23:58:17 +000046 try:
47 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
Florent Xicluna68f71a32011-10-28 16:06:23 +020048 except OSError:
Tim Peters90ee7eb2004-07-18 23:58:17 +000049 pass
Alex Martellif09994e2003-11-09 16:44:09 +000050 else:
Guido van Rossum0e548712002-08-09 16:14:33 +000051 # flags read successfully, modify
52 flags |= _fcntl.FD_CLOEXEC
53 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
Tim Peters291f14e2003-07-22 02:50:01 +000054
Guido van Rossum0e548712002-08-09 16:14:33 +000055
56try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000057 import _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000058except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000059 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000060_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000061
62_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000063if hasattr(_os, 'O_NOINHERIT'):
64 _text_openflags |= _os.O_NOINHERIT
65if hasattr(_os, 'O_NOFOLLOW'):
66 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000067
68_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000069if hasattr(_os, 'O_BINARY'):
70 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000071
72if hasattr(_os, 'TMP_MAX'):
73 TMP_MAX = _os.TMP_MAX
74else:
75 TMP_MAX = 10000
76
R David Murray3a420c72011-06-22 21:01:13 -040077# Although it does not have an underscore for historical reasons, this
78# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000079template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000080
Guido van Rossum0e548712002-08-09 16:14:33 +000081# Internal routines.
82
83_once_lock = _allocate_lock()
84
Guido van Rossumb256159392003-11-10 02:16:36 +000085if hasattr(_os, "lstat"):
86 _stat = _os.lstat
87elif hasattr(_os, "stat"):
88 _stat = _os.stat
89else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020090 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000091 # file doesn't exist.
92 def _stat(fn):
Florent Xicluna46f5d142011-10-28 21:58:56 +020093 f = open(fn)
Guido van Rossumb256159392003-11-10 02:16:36 +000094 f.close()
95
96def _exists(fn):
97 try:
98 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020099 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +0000100 return False
101 else:
102 return True
103
Guido van Rossum0e548712002-08-09 16:14:33 +0000104class _RandomNameSequence:
105 """An instance of _RandomNameSequence generates an endless
106 sequence of unpredictable strings which can safely be incorporated
107 into file names. Each string is six characters long. Multiple
108 threads can safely use the same instance at the same time.
109
110 _RandomNameSequence is an iterator."""
111
Raymond Hettinger572895b2010-11-09 03:43:58 +0000112 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +0000113
Antoine Pitrou4558bad2011-11-25 21:28:15 +0100114 @property
115 def rng(self):
116 cur_pid = _os.getpid()
117 if cur_pid != getattr(self, '_rng_pid', None):
118 self._rng = _Random()
119 self._rng_pid = cur_pid
120 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000121
Guido van Rossum0e548712002-08-09 16:14:33 +0000122 def __iter__(self):
123 return self
124
Georg Brandla18af4e2007-04-21 15:47:16 +0000125 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000126 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000127 choose = self.rng.choice
Raymond Hettinger572895b2010-11-09 03:43:58 +0000128 letters = [choose(c) for dummy in "123456"]
129 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000130
131def _candidate_tempdir_list():
132 """Generate a list of candidate temporary directories which
133 _get_default_tempdir will try."""
134
135 dirlist = []
136
137 # First, try the environment.
138 for envname in 'TMPDIR', 'TEMP', 'TMP':
139 dirname = _os.getenv(envname)
140 if dirname: dirlist.append(dirname)
141
142 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000143 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000144 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
145 else:
146 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
147
148 # As a last resort, the current directory.
149 try:
150 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200151 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000152 dirlist.append(_os.curdir)
153
154 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000155
Guido van Rossum0e548712002-08-09 16:14:33 +0000156def _get_default_tempdir():
157 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000158 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000159
160 We determine whether or not a candidate temp dir is usable by
161 trying to create and write to a file in that directory. If this
162 is successful, the test file is deleted. To prevent denial of
163 service, the name of the test file must be randomized."""
164
165 namer = _RandomNameSequence()
166 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000167
168 for dir in dirlist:
169 if dir != _os.curdir:
170 dir = _os.path.normcase(_os.path.abspath(dir))
171 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000172 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000173 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000174 filename = _os.path.join(dir, name)
175 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000176 fd = _os.open(filename, _bin_openflags, 0o600)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200177 try:
178 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200179 with _io.open(fd, 'wb', closefd=False) as fp:
180 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200181 finally:
182 _os.close(fd)
183 finally:
184 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000185 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200186 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000187 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200188 except OSError:
189 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200190 raise FileNotFoundError(_errno.ENOENT,
191 "No usable temporary directory found in %s" %
192 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000193
Guido van Rossume888cdc2002-08-17 14:50:24 +0000194_name_sequence = None
195
Guido van Rossum0e548712002-08-09 16:14:33 +0000196def _get_candidate_names():
197 """Common setup sequence for all user-callable interfaces."""
198
Guido van Rossume888cdc2002-08-17 14:50:24 +0000199 global _name_sequence
200 if _name_sequence is None:
201 _once_lock.acquire()
202 try:
203 if _name_sequence is None:
204 _name_sequence = _RandomNameSequence()
205 finally:
206 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000207 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000208
209
Guido van Rossum0e548712002-08-09 16:14:33 +0000210def _mkstemp_inner(dir, pre, suf, flags):
211 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000212
Guido van Rossum0e548712002-08-09 16:14:33 +0000213 names = _get_candidate_names()
214
Guido van Rossum805365e2007-05-07 22:24:25 +0000215 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000216 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000217 file = _os.path.join(dir, pre + name + suf)
218 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000219 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000220 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000221 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200222 except FileExistsError:
223 continue # try again
Eli Benderskyf315df32013-09-06 06:11:19 -0700224 except PermissionError:
225 # This exception is thrown when a directory with the chosen name
226 # already exists on windows.
227 if _os.name == 'nt':
228 continue
229 else:
230 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000231
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200232 raise FileExistsError(_errno.EEXIST,
233 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000234
Guido van Rossum0e548712002-08-09 16:14:33 +0000235
236# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000237
Guido van Rossum41f95031992-03-31 19:02:01 +0000238def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000239 """Accessor for tempdir.template."""
240 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000241
Guido van Rossume888cdc2002-08-17 14:50:24 +0000242tempdir = None
243
Guido van Rossum0e548712002-08-09 16:14:33 +0000244def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000245 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000246 global tempdir
247 if tempdir is None:
248 _once_lock.acquire()
249 try:
250 if tempdir is None:
251 tempdir = _get_default_tempdir()
252 finally:
253 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000254 return tempdir
255
Guido van Rossume888cdc2002-08-17 14:50:24 +0000256def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000257 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000258 file. The return value is a pair (fd, name) where fd is the
259 file descriptor returned by os.open, and name is the filename.
260
261 If 'suffix' is specified, the file name will end with that suffix,
262 otherwise there will be no suffix.
263
264 If 'prefix' is specified, the file name will begin with that prefix,
265 otherwise a default prefix is used.
266
267 If 'dir' is specified, the file will be created in that directory,
268 otherwise a default directory is used.
269
Tim Peters04490bf2002-08-14 15:41:26 +0000270 If 'text' is specified and true, the file is opened in text
271 mode. Else (the default) the file is opened in binary mode. On
272 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000273
274 The file is readable and writable only by the creating user ID.
275 If the operating system uses permission bits to indicate whether a
276 file is executable, the file is executable by no one. The file
277 descriptor is not inherited by children of this process.
278
279 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000280 """
281
Guido van Rossume888cdc2002-08-17 14:50:24 +0000282 if dir is None:
283 dir = gettempdir()
284
Tim Peters04490bf2002-08-14 15:41:26 +0000285 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000286 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000287 else:
288 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000289
290 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000291
Guido van Rossumeee94981991-11-12 15:38:08 +0000292
Guido van Rossume888cdc2002-08-17 14:50:24 +0000293def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000294 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000295 directory. The return value is the pathname of the directory.
296
Tim Peters04490bf2002-08-14 15:41:26 +0000297 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000298 not accepted.
299
300 The directory is readable, writable, and searchable only by the
301 creating user.
302
303 Caller is responsible for deleting the directory when done with it.
304 """
305
Guido van Rossume888cdc2002-08-17 14:50:24 +0000306 if dir is None:
307 dir = gettempdir()
308
Guido van Rossum0e548712002-08-09 16:14:33 +0000309 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000310
Guido van Rossum805365e2007-05-07 22:24:25 +0000311 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000312 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000313 file = _os.path.join(dir, prefix + name + suffix)
314 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000315 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000316 return file
Florent Xicluna68f71a32011-10-28 16:06:23 +0200317 except FileExistsError:
318 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000319
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200320 raise FileExistsError(_errno.EEXIST,
321 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000322
Guido van Rossume888cdc2002-08-17 14:50:24 +0000323def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000324 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000325 file is not created.
326
Tim Peters04490bf2002-08-14 15:41:26 +0000327 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000328 not accepted.
329
330 This function is unsafe and should not be used. The file name
331 refers to a file that did not exist at some point, but by the time
332 you get around to creating it, someone else may have beaten you to
333 the punch.
334 """
335
Guido van Rossum44f602d2002-11-22 15:56:29 +0000336## from warnings import warn as _warn
337## _warn("mktemp is a potential security risk to your program",
338## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000339
Guido van Rossume888cdc2002-08-17 14:50:24 +0000340 if dir is None:
341 dir = gettempdir()
342
Guido van Rossum0e548712002-08-09 16:14:33 +0000343 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000344 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000345 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000346 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000347 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000348 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000349
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200350 raise FileExistsError(_errno.EEXIST,
351 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000352
Christian Heimes3ecfea712008-02-09 20:51:34 +0000353
Antoine Pitrou17c93262013-12-21 22:14:56 +0100354class _TemporaryFileCloser:
355 """A separate object allowing proper closing of a temporary file's
356 underlying file object, without adding a __del__ method to the
357 temporary file."""
Tim Petersa255a722001-12-18 22:32:40 +0000358
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200359 # Set here since __del__ checks it
360 file = None
361 close_called = False
362
Guido van Rossumd8faa362007-04-27 19:54:29 +0000363 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000364 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000365 self.name = name
Guido van Rossumd8faa362007-04-27 19:54:29 +0000366 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000367
Guido van Rossum0e548712002-08-09 16:14:33 +0000368 # NT provides delete-on-close as a primitive, so we don't need
369 # the wrapper to do anything special. We still use it so that
370 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
371 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000372 # Cache the unlinker so we don't get spurious errors at
373 # shutdown when the module-level "os" is None'd out. Note
374 # that this must be referenced as self.unlink, because the
375 # name TemporaryFileWrapper may also get None'd out before
376 # __del__ is called.
Tim Peters1baa22a2001-01-12 10:02:46 +0000377
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200378 def close(self, unlink=_os.unlink):
379 if not self.close_called and self.file is not None:
Tim Peters6ef966e2002-11-21 15:48:33 +0000380 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000381 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000382 if self.delete:
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200383 unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000384
Antoine Pitrou17c93262013-12-21 22:14:56 +0100385 # Need to ensure the file is deleted on __del__
Guido van Rossum0e548712002-08-09 16:14:33 +0000386 def __del__(self):
387 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000388
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000389 else:
Antoine Pitrou17c93262013-12-21 22:14:56 +0100390 def close(self):
391 if not self.close_called:
392 self.close_called = True
393 self.file.close()
394
395
396class _TemporaryFileWrapper:
397 """Temporary file wrapper
398
399 This class provides a wrapper around files opened for
400 temporary use. In particular, it seeks to automatically
401 remove the file when it is no longer needed.
402 """
403
404 def __init__(self, file, name, delete=True):
405 self.file = file
406 self.name = name
407 self.delete = delete
408 self._closer = _TemporaryFileCloser(file, name, delete)
409
410 def __getattr__(self, name):
411 # Attribute lookups are delegated to the underlying file
412 # and cached for non-numeric results
413 # (i.e. methods are cached, closed and friends are not)
414 file = self.__dict__['file']
415 a = getattr(file, name)
416 if hasattr(a, '__call__'):
417 func = a
418 @_functools.wraps(func)
419 def func_wrapper(*args, **kwargs):
420 return func(*args, **kwargs)
421 # Avoid closing the file as long as the wrapper is alive,
422 # see issue #18879.
423 func_wrapper._closer = self._closer
424 a = func_wrapper
425 if not isinstance(a, int):
426 setattr(self, name, a)
427 return a
428
429 # The underlying __enter__ method returns the wrong object
430 # (self.file) so override it to return the wrapper
431 def __enter__(self):
432 self.file.__enter__()
433 return self
434
435 # Need to trap __exit__ as well to ensure the file gets
436 # deleted when used in a with statement
437 def __exit__(self, exc, value, tb):
438 result = self.file.__exit__(exc, value, tb)
439 self.close()
440 return result
441
442 def close(self):
443 """
444 Close the temporary file, possibly deleting it.
445 """
446 self._closer.close()
447
448 # iter() doesn't use __getattr__ to find the __iter__ method
449 def __iter__(self):
450 return iter(self.file)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000451
452
Guido van Rossumf0c74162007-08-28 03:29:45 +0000453def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
454 newline=None, suffix="", prefix=template,
455 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 """Create and return a temporary file.
457 Arguments:
458 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000459 'mode' -- the mode argument to io.open (default "w+b").
460 'buffering' -- the buffer size argument to io.open (default -1).
461 'encoding' -- the encoding argument to io.open (default None)
462 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000463 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000464 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000465
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000466 Returns an object with a file-like interface; the name of the file
467 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000468 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000469 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000470
Guido van Rossume888cdc2002-08-17 14:50:24 +0000471 if dir is None:
472 dir = gettempdir()
473
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000474 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000475
Guido van Rossum0e548712002-08-09 16:14:33 +0000476 # Setting O_TEMPORARY in the flags causes the OS to delete
477 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000478 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000479 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000480
Guido van Rossum0e548712002-08-09 16:14:33 +0000481 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000482 file = _io.open(fd, mode, buffering=buffering,
483 newline=newline, encoding=encoding)
484
Guido van Rossumd8faa362007-04-27 19:54:29 +0000485 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000486
Jason Tishler80c02af2002-08-14 15:10:09 +0000487if _os.name != 'posix' or _os.sys.platform == 'cygwin':
488 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
489 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000490 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000491
492else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000493 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
494 newline=None, suffix="", prefix=template,
495 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000496 """Create and return a temporary file.
497 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000498 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000499 'mode' -- the mode argument to io.open (default "w+b").
500 'buffering' -- the buffer size argument to io.open (default -1).
501 'encoding' -- the encoding argument to io.open (default None)
502 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000503 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000504
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000505 Returns an object with a file-like interface. The file has no
506 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000507 """
508
Guido van Rossume888cdc2002-08-17 14:50:24 +0000509 if dir is None:
510 dir = gettempdir()
511
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000512 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000513
514 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
515 try:
516 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000517 return _io.open(fd, mode, buffering=buffering,
518 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000519 except:
520 _os.close(fd)
521 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000522
523class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200524 """Temporary file wrapper, specialized to switch from BytesIO
525 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000526 when a fileno is needed.
527 """
528 _rolled = False
529
Guido van Rossumf0c74162007-08-28 03:29:45 +0000530 def __init__(self, max_size=0, mode='w+b', buffering=-1,
531 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000532 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000533 if 'b' in mode:
534 self._file = _io.BytesIO()
535 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000536 # Setting newline="\n" avoids newline translation;
537 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000538 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000539 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000540 self._max_size = max_size
541 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000542 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
543 'suffix': suffix, 'prefix': prefix,
544 'encoding': encoding, 'newline': newline,
545 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000546
547 def _check(self, file):
548 if self._rolled: return
549 max_size = self._max_size
550 if max_size and file.tell() > max_size:
551 self.rollover()
552
553 def rollover(self):
554 if self._rolled: return
555 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000556 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000557 del self._TemporaryFileArgs
558
559 newfile.write(file.getvalue())
560 newfile.seek(file.tell(), 0)
561
562 self._rolled = True
563
Christian Heimes3ecfea712008-02-09 20:51:34 +0000564 # The method caching trick from NamedTemporaryFile
565 # won't work here, because _file may change from a
Serhiy Storchaka50254c52013-08-29 11:35:43 +0300566 # BytesIO/StringIO instance to a real file. So we list
Christian Heimes3ecfea712008-02-09 20:51:34 +0000567 # all the methods directly.
568
569 # Context management protocol
570 def __enter__(self):
571 if self._file.closed:
572 raise ValueError("Cannot enter context with closed file")
573 return self
574
575 def __exit__(self, exc, value, tb):
576 self._file.close()
577
Guido van Rossumd8faa362007-04-27 19:54:29 +0000578 # file protocol
579 def __iter__(self):
580 return self._file.__iter__()
581
582 def close(self):
583 self._file.close()
584
585 @property
586 def closed(self):
587 return self._file.closed
588
589 @property
590 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200591 try:
592 return self._file.encoding
593 except AttributeError:
594 if 'b' in self._TemporaryFileArgs['mode']:
595 raise
596 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000597
598 def fileno(self):
599 self.rollover()
600 return self._file.fileno()
601
602 def flush(self):
603 self._file.flush()
604
605 def isatty(self):
606 return self._file.isatty()
607
608 @property
609 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200610 try:
611 return self._file.mode
612 except AttributeError:
613 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000614
615 @property
616 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200617 try:
618 return self._file.name
619 except AttributeError:
620 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000621
622 @property
623 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200624 try:
625 return self._file.newlines
626 except AttributeError:
627 if 'b' in self._TemporaryFileArgs['mode']:
628 raise
629 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000630
631 def read(self, *args):
632 return self._file.read(*args)
633
634 def readline(self, *args):
635 return self._file.readline(*args)
636
637 def readlines(self, *args):
638 return self._file.readlines(*args)
639
640 def seek(self, *args):
641 self._file.seek(*args)
642
643 @property
644 def softspace(self):
645 return self._file.softspace
646
647 def tell(self):
648 return self._file.tell()
649
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100650 def truncate(self, size=None):
651 if size is None:
652 self._file.truncate()
653 else:
654 if size > self._max_size:
655 self.rollover()
656 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000657
658 def write(self, s):
659 file = self._file
660 rv = file.write(s)
661 self._check(file)
662 return rv
663
664 def writelines(self, iterable):
665 file = self._file
666 rv = file.writelines(iterable)
667 self._check(file)
668 return rv
669
Nick Coghlan543af752010-10-24 11:23:25 +0000670
671class TemporaryDirectory(object):
672 """Create and return a temporary directory. This has the same
673 behavior as mkdtemp but can be used as a context manager. For
674 example:
675
676 with TemporaryDirectory() as tmpdir:
677 ...
678
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300679 Upon exiting the context, the directory and everything contained
Nick Coghlan543af752010-10-24 11:23:25 +0000680 in it are removed.
681 """
682
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200683 # Handle mkdtemp raising an exception
684 name = None
685 _closed = False
686
Nick Coghlan543af752010-10-24 11:23:25 +0000687 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000688 self.name = mkdtemp(suffix, prefix, dir)
689
690 def __repr__(self):
691 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000692
693 def __enter__(self):
694 return self.name
695
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200696 def cleanup(self, _warn=False, _warnings=_warnings):
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000697 if self.name and not self._closed:
698 try:
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200699 _shutil.rmtree(self.name)
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000700 except (TypeError, AttributeError) as ex:
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200701 if "None" not in '%s' % (ex,):
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000702 raise
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200703 self._rmtree(self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000704 self._closed = True
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200705 if _warn and _warnings.warn:
706 try:
707 _warnings.warn("Implicitly cleaning up {!r}".format(self),
708 ResourceWarning)
709 except:
710 if _is_running:
711 raise
712 # Don't raise an exception if modules needed for emitting
713 # a warning are already cleaned in shutdown process.
Nick Coghlan543af752010-10-24 11:23:25 +0000714
715 def __exit__(self, exc, value, tb):
716 self.cleanup()
717
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000718 def __del__(self):
719 # Issue a ResourceWarning if implicit cleanup needed
720 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000721
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200722 def _rmtree(self, path, _OSError=OSError, _sep=_os.path.sep,
723 _listdir=_os.listdir, _remove=_os.remove, _rmdir=_os.rmdir):
Nick Coghlan543af752010-10-24 11:23:25 +0000724 # Essentially a stripped down version of shutil.rmtree. We can't
725 # use globals because they may be None'ed out at shutdown.
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200726 if not isinstance(path, str):
727 _sep = _sep.encode()
Nick Coghlan543af752010-10-24 11:23:25 +0000728 try:
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200729 for name in _listdir(path):
730 fullname = path + _sep + name
731 try:
732 _remove(fullname)
733 except _OSError:
734 self._rmtree(fullname)
735 _rmdir(path)
736 except _OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000737 pass
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200738
739_is_running = True
740
741def _on_shutdown():
742 global _is_running
743 _is_running = False
744
745_atexit.register(_on_shutdown)