blob: ae35314bd6ba06066b5ff311af78d78448f6fd77 [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.
13 template - the default prefix for all temporary names.
14 You may change this to control the default prefix.
15 tempdir - If this is set to a string before the first use of
16 any routine from this module, it will be considered as
17 another candidate location to store temporary files.
18"""
Skip Montanaro40fc1602001-03-01 04:27:19 +000019
Guido van Rossum0e548712002-08-09 16:14:33 +000020__all__ = [
21 "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
Nick Coghlan543af752010-10-24 11:23:25 +000022 "SpooledTemporaryFile", "TemporaryDirectory",
Guido van Rossum0e548712002-08-09 16:14:33 +000023 "mkstemp", "mkdtemp", # low level safe interfaces
24 "mktemp", # deprecated unsafe interface
25 "TMP_MAX", "gettempprefix", # constants
26 "tempdir", "gettempdir"
27 ]
Guido van Rossum41f95031992-03-31 19:02:01 +000028
Tim Peters4fd5a062002-01-28 23:11:23 +000029
Guido van Rossum0e548712002-08-09 16:14:33 +000030# Imports.
Tim Peters4fd5a062002-01-28 23:11:23 +000031
Nick Coghlan6b22f3f2010-12-12 15:24:21 +000032import warnings as _warnings
33import sys as _sys
Guido van Rossum9a634702007-07-09 10:24:45 +000034import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000035import os as _os
36import errno as _errno
37from 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)
48 except IOError:
49 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
Tim Petersbd7b4c72002-08-13 23:33:56 +000077template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000078
Guido van Rossum0e548712002-08-09 16:14:33 +000079# Internal routines.
80
81_once_lock = _allocate_lock()
82
Guido van Rossumb256159392003-11-10 02:16:36 +000083if hasattr(_os, "lstat"):
84 _stat = _os.lstat
85elif hasattr(_os, "stat"):
86 _stat = _os.stat
87else:
88 # Fallback. All we need is something that raises os.error if the
89 # file doesn't exist.
90 def _stat(fn):
91 try:
92 f = open(fn)
93 except IOError:
94 raise _os.error
95 f.close()
96
97def _exists(fn):
98 try:
99 _stat(fn)
100 except _os.error:
101 return False
102 else:
103 return True
104
Guido van Rossum0e548712002-08-09 16:14:33 +0000105class _RandomNameSequence:
106 """An instance of _RandomNameSequence generates an endless
107 sequence of unpredictable strings which can safely be incorporated
108 into file names. Each string is six characters long. Multiple
109 threads can safely use the same instance at the same time.
110
111 _RandomNameSequence is an iterator."""
112
Raymond Hettinger572895b2010-11-09 03:43:58 +0000113 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +0000114
Antoine Pitrou4558bad2011-11-25 21:28:15 +0100115 @property
116 def rng(self):
117 cur_pid = _os.getpid()
118 if cur_pid != getattr(self, '_rng_pid', None):
119 self._rng = _Random()
120 self._rng_pid = cur_pid
121 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000122
Guido van Rossum0e548712002-08-09 16:14:33 +0000123 def __iter__(self):
124 return self
125
Georg Brandla18af4e2007-04-21 15:47:16 +0000126 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000127 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000128 choose = self.rng.choice
Raymond Hettinger572895b2010-11-09 03:43:58 +0000129 letters = [choose(c) for dummy in "123456"]
130 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000131
132def _candidate_tempdir_list():
133 """Generate a list of candidate temporary directories which
134 _get_default_tempdir will try."""
135
136 dirlist = []
137
138 # First, try the environment.
139 for envname in 'TMPDIR', 'TEMP', 'TMP':
140 dirname = _os.getenv(envname)
141 if dirname: dirlist.append(dirname)
142
143 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000144 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000145 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
146 else:
147 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
148
149 # As a last resort, the current directory.
150 try:
151 dirlist.append(_os.getcwd())
152 except (AttributeError, _os.error):
153 dirlist.append(_os.curdir)
154
155 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000156
Guido van Rossum0e548712002-08-09 16:14:33 +0000157def _get_default_tempdir():
158 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000159 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000160
161 We determine whether or not a candidate temp dir is usable by
162 trying to create and write to a file in that directory. If this
163 is successful, the test file is deleted. To prevent denial of
164 service, the name of the test file must be randomized."""
165
166 namer = _RandomNameSequence()
167 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000168
169 for dir in dirlist:
170 if dir != _os.curdir:
171 dir = _os.path.normcase(_os.path.abspath(dir))
172 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000173 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000174 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000175 filename = _os.path.join(dir, name)
176 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000177 fd = _os.open(filename, _bin_openflags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000178 fp = _io.open(fd, 'wb')
179 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000180 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000181 _os.unlink(filename)
182 del fp, fd
183 return dir
Guido van Rossumb940e112007-01-10 16:19:56 +0000184 except (OSError, IOError) as e:
Georg Brandl7816e512007-10-22 12:42:46 +0000185 if e.args[0] != _errno.EEXIST:
Guido van Rossum0e548712002-08-09 16:14:33 +0000186 break # no point trying more names in this directory
187 pass
Collin Winterce36ad82007-08-30 01:19:48 +0000188 raise IOError(_errno.ENOENT,
189 "No usable temporary directory found in %s" % dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000190
Guido van Rossume888cdc2002-08-17 14:50:24 +0000191_name_sequence = None
192
Guido van Rossum0e548712002-08-09 16:14:33 +0000193def _get_candidate_names():
194 """Common setup sequence for all user-callable interfaces."""
195
Guido van Rossume888cdc2002-08-17 14:50:24 +0000196 global _name_sequence
197 if _name_sequence is None:
198 _once_lock.acquire()
199 try:
200 if _name_sequence is None:
201 _name_sequence = _RandomNameSequence()
202 finally:
203 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000204 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000205
206
Guido van Rossum0e548712002-08-09 16:14:33 +0000207def _mkstemp_inner(dir, pre, suf, flags):
208 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000209
Guido van Rossum0e548712002-08-09 16:14:33 +0000210 names = _get_candidate_names()
211
Guido van Rossum805365e2007-05-07 22:24:25 +0000212 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000213 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000214 file = _os.path.join(dir, pre + name + suf)
215 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000216 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000217 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000218 return (fd, _os.path.abspath(file))
Guido van Rossumb940e112007-01-10 16:19:56 +0000219 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000220 if e.errno == _errno.EEXIST:
221 continue # try again
222 raise
223
Collin Winterce36ad82007-08-30 01:19:48 +0000224 raise IOError(_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000225
Guido van Rossum0e548712002-08-09 16:14:33 +0000226
227# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000228
Guido van Rossum41f95031992-03-31 19:02:01 +0000229def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000230 """Accessor for tempdir.template."""
231 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000232
Guido van Rossume888cdc2002-08-17 14:50:24 +0000233tempdir = None
234
Guido van Rossum0e548712002-08-09 16:14:33 +0000235def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000236 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000237 global tempdir
238 if tempdir is None:
239 _once_lock.acquire()
240 try:
241 if tempdir is None:
242 tempdir = _get_default_tempdir()
243 finally:
244 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000245 return tempdir
246
Guido van Rossume888cdc2002-08-17 14:50:24 +0000247def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000248 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000249 file. The return value is a pair (fd, name) where fd is the
250 file descriptor returned by os.open, and name is the filename.
251
252 If 'suffix' is specified, the file name will end with that suffix,
253 otherwise there will be no suffix.
254
255 If 'prefix' is specified, the file name will begin with that prefix,
256 otherwise a default prefix is used.
257
258 If 'dir' is specified, the file will be created in that directory,
259 otherwise a default directory is used.
260
Tim Peters04490bf2002-08-14 15:41:26 +0000261 If 'text' is specified and true, the file is opened in text
262 mode. Else (the default) the file is opened in binary mode. On
263 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000264
265 The file is readable and writable only by the creating user ID.
266 If the operating system uses permission bits to indicate whether a
267 file is executable, the file is executable by no one. The file
268 descriptor is not inherited by children of this process.
269
270 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000271 """
272
Guido van Rossume888cdc2002-08-17 14:50:24 +0000273 if dir is None:
274 dir = gettempdir()
275
Tim Peters04490bf2002-08-14 15:41:26 +0000276 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000277 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000278 else:
279 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000280
281 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000282
Guido van Rossumeee94981991-11-12 15:38:08 +0000283
Guido van Rossume888cdc2002-08-17 14:50:24 +0000284def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000285 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000286 directory. The return value is the pathname of the directory.
287
Tim Peters04490bf2002-08-14 15:41:26 +0000288 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000289 not accepted.
290
291 The directory is readable, writable, and searchable only by the
292 creating user.
293
294 Caller is responsible for deleting the directory when done with it.
295 """
296
Guido van Rossume888cdc2002-08-17 14:50:24 +0000297 if dir is None:
298 dir = gettempdir()
299
Guido van Rossum0e548712002-08-09 16:14:33 +0000300 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000301
Guido van Rossum805365e2007-05-07 22:24:25 +0000302 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000303 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000304 file = _os.path.join(dir, prefix + name + suffix)
305 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000306 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000307 return file
Guido van Rossumb940e112007-01-10 16:19:56 +0000308 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000309 if e.errno == _errno.EEXIST:
310 continue # try again
311 raise
312
Collin Winterce36ad82007-08-30 01:19:48 +0000313 raise IOError(_errno.EEXIST, "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000314
Guido van Rossume888cdc2002-08-17 14:50:24 +0000315def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000316 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000317 file is not created.
318
Tim Peters04490bf2002-08-14 15:41:26 +0000319 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000320 not accepted.
321
322 This function is unsafe and should not be used. The file name
323 refers to a file that did not exist at some point, but by the time
324 you get around to creating it, someone else may have beaten you to
325 the punch.
326 """
327
Guido van Rossum44f602d2002-11-22 15:56:29 +0000328## from warnings import warn as _warn
329## _warn("mktemp is a potential security risk to your program",
330## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000331
Guido van Rossume888cdc2002-08-17 14:50:24 +0000332 if dir is None:
333 dir = gettempdir()
334
Guido van Rossum0e548712002-08-09 16:14:33 +0000335 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000336 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000337 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000338 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000339 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000340 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000341
Collin Winterce36ad82007-08-30 01:19:48 +0000342 raise IOError(_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000343
Christian Heimes3ecfea712008-02-09 20:51:34 +0000344
Guido van Rossum0e548712002-08-09 16:14:33 +0000345class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000346 """Temporary file wrapper
347
Guido van Rossum0e548712002-08-09 16:14:33 +0000348 This class provides a wrapper around files opened for
349 temporary use. In particular, it seeks to automatically
350 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000351 """
Tim Petersa255a722001-12-18 22:32:40 +0000352
Guido van Rossumd8faa362007-04-27 19:54:29 +0000353 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000354 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000355 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000356 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000357 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000358
Guido van Rossumca549821997-08-12 18:00:12 +0000359 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000360 # Attribute lookups are delegated to the underlying file
361 # and cached for non-numeric results
362 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000363 file = self.__dict__['file']
364 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000365 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000366 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000367 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000368
Christian Heimes3ecfea712008-02-09 20:51:34 +0000369 # The underlying __enter__ method returns the wrong object
370 # (self.file) so override it to return the wrapper
371 def __enter__(self):
372 self.file.__enter__()
373 return self
374
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000375 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000376 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000377 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000378
Guido van Rossum0e548712002-08-09 16:14:33 +0000379 # NT provides delete-on-close as a primitive, so we don't need
380 # the wrapper to do anything special. We still use it so that
381 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
382 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000383 # Cache the unlinker so we don't get spurious errors at
384 # shutdown when the module-level "os" is None'd out. Note
385 # that this must be referenced as self.unlink, because the
386 # name TemporaryFileWrapper may also get None'd out before
387 # __del__ is called.
388 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000389
Guido van Rossum0e548712002-08-09 16:14:33 +0000390 def close(self):
391 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000392 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000393 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000394 if self.delete:
395 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000396
Guido van Rossum0e548712002-08-09 16:14:33 +0000397 def __del__(self):
398 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000399
Christian Heimes3ecfea712008-02-09 20:51:34 +0000400 # Need to trap __exit__ as well to ensure the file gets
401 # deleted when used in a with statement
402 def __exit__(self, exc, value, tb):
403 result = self.file.__exit__(exc, value, tb)
404 self.close()
405 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000406 else:
407 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000408 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000409
410
Guido van Rossumf0c74162007-08-28 03:29:45 +0000411def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
412 newline=None, suffix="", prefix=template,
413 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000414 """Create and return a temporary file.
415 Arguments:
416 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000417 'mode' -- the mode argument to io.open (default "w+b").
418 'buffering' -- the buffer size argument to io.open (default -1).
419 'encoding' -- the encoding argument to io.open (default None)
420 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000421 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000422 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000423
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000424 Returns an object with a file-like interface; the name of the file
425 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000426 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000427 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000428
Guido van Rossume888cdc2002-08-17 14:50:24 +0000429 if dir is None:
430 dir = gettempdir()
431
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000432 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000433
Guido van Rossum0e548712002-08-09 16:14:33 +0000434 # Setting O_TEMPORARY in the flags causes the OS to delete
435 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000436 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000437 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000438
Guido van Rossum0e548712002-08-09 16:14:33 +0000439 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000440 file = _io.open(fd, mode, buffering=buffering,
441 newline=newline, encoding=encoding)
442
Guido van Rossumd8faa362007-04-27 19:54:29 +0000443 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000444
Jason Tishler80c02af2002-08-14 15:10:09 +0000445if _os.name != 'posix' or _os.sys.platform == 'cygwin':
446 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
447 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000448 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000449
450else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000451 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
452 newline=None, suffix="", prefix=template,
453 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000454 """Create and return a temporary file.
455 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000456 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000457 'mode' -- the mode argument to io.open (default "w+b").
458 'buffering' -- the buffer size argument to io.open (default -1).
459 'encoding' -- the encoding argument to io.open (default None)
460 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000461 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000462
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000463 Returns an object with a file-like interface. The file has no
464 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000465 """
466
Guido van Rossume888cdc2002-08-17 14:50:24 +0000467 if dir is None:
468 dir = gettempdir()
469
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000470 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000471
472 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
473 try:
474 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000475 return _io.open(fd, mode, buffering=buffering,
476 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000477 except:
478 _os.close(fd)
479 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000480
481class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200482 """Temporary file wrapper, specialized to switch from BytesIO
483 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484 when a fileno is needed.
485 """
486 _rolled = False
487
Guido van Rossumf0c74162007-08-28 03:29:45 +0000488 def __init__(self, max_size=0, mode='w+b', buffering=-1,
489 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000490 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000491 if 'b' in mode:
492 self._file = _io.BytesIO()
493 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000494 # Setting newline="\n" avoids newline translation;
495 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000496 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000497 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000498 self._max_size = max_size
499 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000500 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
501 'suffix': suffix, 'prefix': prefix,
502 'encoding': encoding, 'newline': newline,
503 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000504
505 def _check(self, file):
506 if self._rolled: return
507 max_size = self._max_size
508 if max_size and file.tell() > max_size:
509 self.rollover()
510
511 def rollover(self):
512 if self._rolled: return
513 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000514 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000515 del self._TemporaryFileArgs
516
517 newfile.write(file.getvalue())
518 newfile.seek(file.tell(), 0)
519
520 self._rolled = True
521
Christian Heimes3ecfea712008-02-09 20:51:34 +0000522 # The method caching trick from NamedTemporaryFile
523 # won't work here, because _file may change from a
524 # _StringIO instance to a real file. So we list
525 # all the methods directly.
526
527 # Context management protocol
528 def __enter__(self):
529 if self._file.closed:
530 raise ValueError("Cannot enter context with closed file")
531 return self
532
533 def __exit__(self, exc, value, tb):
534 self._file.close()
535
Guido van Rossumd8faa362007-04-27 19:54:29 +0000536 # file protocol
537 def __iter__(self):
538 return self._file.__iter__()
539
540 def close(self):
541 self._file.close()
542
543 @property
544 def closed(self):
545 return self._file.closed
546
547 @property
548 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200549 try:
550 return self._file.encoding
551 except AttributeError:
552 if 'b' in self._TemporaryFileArgs['mode']:
553 raise
554 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000555
556 def fileno(self):
557 self.rollover()
558 return self._file.fileno()
559
560 def flush(self):
561 self._file.flush()
562
563 def isatty(self):
564 return self._file.isatty()
565
566 @property
567 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200568 try:
569 return self._file.mode
570 except AttributeError:
571 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000572
573 @property
574 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200575 try:
576 return self._file.name
577 except AttributeError:
578 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000579
580 @property
581 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200582 try:
583 return self._file.newlines
584 except AttributeError:
585 if 'b' in self._TemporaryFileArgs['mode']:
586 raise
587 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000588
589 def read(self, *args):
590 return self._file.read(*args)
591
592 def readline(self, *args):
593 return self._file.readline(*args)
594
595 def readlines(self, *args):
596 return self._file.readlines(*args)
597
598 def seek(self, *args):
599 self._file.seek(*args)
600
601 @property
602 def softspace(self):
603 return self._file.softspace
604
605 def tell(self):
606 return self._file.tell()
607
608 def truncate(self):
609 self._file.truncate()
610
611 def write(self, s):
612 file = self._file
613 rv = file.write(s)
614 self._check(file)
615 return rv
616
617 def writelines(self, iterable):
618 file = self._file
619 rv = file.writelines(iterable)
620 self._check(file)
621 return rv
622
Nick Coghlan543af752010-10-24 11:23:25 +0000623
624class TemporaryDirectory(object):
625 """Create and return a temporary directory. This has the same
626 behavior as mkdtemp but can be used as a context manager. For
627 example:
628
629 with TemporaryDirectory() as tmpdir:
630 ...
631
632 Upon exiting the context, the directory and everthing contained
633 in it are removed.
634 """
635
636 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000637 self._closed = False
Andrew Svetlov737fb892012-12-18 21:14:22 +0200638 self.name = None # Handle mkdtemp raising an exception
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000639 self.name = mkdtemp(suffix, prefix, dir)
640
641 def __repr__(self):
642 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000643
644 def __enter__(self):
645 return self.name
646
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000647 def cleanup(self, _warn=False):
648 if self.name and not self._closed:
649 try:
650 self._rmtree(self.name)
651 except (TypeError, AttributeError) as ex:
652 # Issue #10188: Emit a warning on stderr
653 # if the directory could not be cleaned
654 # up due to missing globals
655 if "None" not in str(ex):
656 raise
657 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
658 file=_sys.stderr)
659 return
Nick Coghlan543af752010-10-24 11:23:25 +0000660 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000661 if _warn:
662 self._warn("Implicitly cleaning up {!r}".format(self),
663 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000664
665 def __exit__(self, exc, value, tb):
666 self.cleanup()
667
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000668 def __del__(self):
669 # Issue a ResourceWarning if implicit cleanup needed
670 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000671
672 # XXX (ncoghlan): The following code attempts to make
673 # this class tolerant of the module nulling out process
674 # that happens during CPython interpreter shutdown
675 # Alas, it doesn't actually manage it. See issue #10188
676 _listdir = staticmethod(_os.listdir)
677 _path_join = staticmethod(_os.path.join)
678 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200679 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000680 _remove = staticmethod(_os.remove)
681 _rmdir = staticmethod(_os.rmdir)
682 _os_error = _os.error
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000683 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000684
685 def _rmtree(self, path):
686 # Essentially a stripped down version of shutil.rmtree. We can't
687 # use globals because they may be None'ed out at shutdown.
688 for name in self._listdir(path):
689 fullname = self._path_join(path, name)
690 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200691 isdir = self._isdir(fullname) and not self._islink(fullname)
Nick Coghlan543af752010-10-24 11:23:25 +0000692 except self._os_error:
693 isdir = False
694 if isdir:
695 self._rmtree(fullname)
696 else:
697 try:
698 self._remove(fullname)
699 except self._os_error:
700 pass
701 try:
702 self._rmdir(path)
703 except self._os_error:
704 pass