blob: 0aaee541c3bb1c92ff382a3effc91016bcbd7d4d [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
Nick Coghlan6b22f3f2010-12-12 15:24:21 +000030import warnings as _warnings
31import sys as _sys
Guido van Rossum9a634702007-07-09 10:24:45 +000032import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000033import os as _os
Guido van Rossum0e548712002-08-09 16:14:33 +000034from random import Random as _Random
35
Guido van Rossumd8faa362007-04-27 19:54:29 +000036try:
Guido van Rossum0e548712002-08-09 16:14:33 +000037 import fcntl as _fcntl
Tim Peters90ee7eb2004-07-18 23:58:17 +000038except ImportError:
Tim Peters291f14e2003-07-22 02:50:01 +000039 def _set_cloexec(fd):
40 pass
41else:
Guido van Rossum0e548712002-08-09 16:14:33 +000042 def _set_cloexec(fd):
Tim Peters90ee7eb2004-07-18 23:58:17 +000043 try:
44 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
Florent Xicluna68f71a32011-10-28 16:06:23 +020045 except OSError:
Tim Peters90ee7eb2004-07-18 23:58:17 +000046 pass
Alex Martellif09994e2003-11-09 16:44:09 +000047 else:
Guido van Rossum0e548712002-08-09 16:14:33 +000048 # flags read successfully, modify
49 flags |= _fcntl.FD_CLOEXEC
50 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
Tim Peters291f14e2003-07-22 02:50:01 +000051
Guido van Rossum0e548712002-08-09 16:14:33 +000052
53try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000054 import _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000055except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000056 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000057_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000058
59_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Charles-François Natalib9a76e22013-01-04 18:33:02 +010060if hasattr(_os, 'O_CLOEXEC'):
61 _text_openflags |= _os.O_CLOEXEC
Tim Petersa0d55de2002-08-09 18:01:01 +000062if hasattr(_os, 'O_NOINHERIT'):
63 _text_openflags |= _os.O_NOINHERIT
64if hasattr(_os, 'O_NOFOLLOW'):
65 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000066
67_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000068if hasattr(_os, 'O_BINARY'):
69 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000070
71if hasattr(_os, 'TMP_MAX'):
72 TMP_MAX = _os.TMP_MAX
73else:
74 TMP_MAX = 10000
75
R David Murray3a420c72011-06-22 21:01:13 -040076# Although it does not have an underscore for historical reasons, this
77# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000078template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000079
Guido van Rossum0e548712002-08-09 16:14:33 +000080# Internal routines.
81
82_once_lock = _allocate_lock()
83
Guido van Rossumb256159392003-11-10 02:16:36 +000084if hasattr(_os, "lstat"):
85 _stat = _os.lstat
86elif hasattr(_os, "stat"):
87 _stat = _os.stat
88else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020089 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000090 # file doesn't exist.
91 def _stat(fn):
Florent Xicluna46f5d142011-10-28 21:58:56 +020092 f = open(fn)
Guido van Rossumb256159392003-11-10 02:16:36 +000093 f.close()
94
95def _exists(fn):
96 try:
97 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020098 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000099 return False
100 else:
101 return True
102
Guido van Rossum0e548712002-08-09 16:14:33 +0000103class _RandomNameSequence:
104 """An instance of _RandomNameSequence generates an endless
105 sequence of unpredictable strings which can safely be incorporated
106 into file names. Each string is six characters long. Multiple
107 threads can safely use the same instance at the same time.
108
109 _RandomNameSequence is an iterator."""
110
Raymond Hettinger572895b2010-11-09 03:43:58 +0000111 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +0000112
Antoine Pitrou4558bad2011-11-25 21:28:15 +0100113 @property
114 def rng(self):
115 cur_pid = _os.getpid()
116 if cur_pid != getattr(self, '_rng_pid', None):
117 self._rng = _Random()
118 self._rng_pid = cur_pid
119 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000120
Guido van Rossum0e548712002-08-09 16:14:33 +0000121 def __iter__(self):
122 return self
123
Georg Brandla18af4e2007-04-21 15:47:16 +0000124 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000125 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000126 choose = self.rng.choice
Raymond Hettinger572895b2010-11-09 03:43:58 +0000127 letters = [choose(c) for dummy in "123456"]
128 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000129
130def _candidate_tempdir_list():
131 """Generate a list of candidate temporary directories which
132 _get_default_tempdir will try."""
133
134 dirlist = []
135
136 # First, try the environment.
137 for envname in 'TMPDIR', 'TEMP', 'TMP':
138 dirname = _os.getenv(envname)
139 if dirname: dirlist.append(dirname)
140
141 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000142 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000143 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
144 else:
145 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
146
147 # As a last resort, the current directory.
148 try:
149 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200150 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000151 dirlist.append(_os.curdir)
152
153 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000154
Guido van Rossum0e548712002-08-09 16:14:33 +0000155def _get_default_tempdir():
156 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000157 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000158
159 We determine whether or not a candidate temp dir is usable by
160 trying to create and write to a file in that directory. If this
161 is successful, the test file is deleted. To prevent denial of
162 service, the name of the test file must be randomized."""
163
164 namer = _RandomNameSequence()
165 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000166
167 for dir in dirlist:
168 if dir != _os.curdir:
169 dir = _os.path.normcase(_os.path.abspath(dir))
170 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000171 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000172 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000173 filename = _os.path.join(dir, name)
174 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000175 fd = _os.open(filename, _bin_openflags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000176 fp = _io.open(fd, 'wb')
177 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000178 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000179 _os.unlink(filename)
180 del fp, fd
181 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200182 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000183 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200184 except OSError:
185 break # no point trying more names in this directory
186 raise FileNotFoundError("No usable temporary directory found in %s" % dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000187
Guido van Rossume888cdc2002-08-17 14:50:24 +0000188_name_sequence = None
189
Guido van Rossum0e548712002-08-09 16:14:33 +0000190def _get_candidate_names():
191 """Common setup sequence for all user-callable interfaces."""
192
Guido van Rossume888cdc2002-08-17 14:50:24 +0000193 global _name_sequence
194 if _name_sequence is None:
195 _once_lock.acquire()
196 try:
197 if _name_sequence is None:
198 _name_sequence = _RandomNameSequence()
199 finally:
200 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000201 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000202
203
Guido van Rossum0e548712002-08-09 16:14:33 +0000204def _mkstemp_inner(dir, pre, suf, flags):
205 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000206
Guido van Rossum0e548712002-08-09 16:14:33 +0000207 names = _get_candidate_names()
208
Guido van Rossum805365e2007-05-07 22:24:25 +0000209 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000210 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000211 file = _os.path.join(dir, pre + name + suf)
212 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000213 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000214 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000215 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200216 except FileExistsError:
217 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000218
Florent Xicluna68f71a32011-10-28 16:06:23 +0200219 raise FileExistsError("No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000220
Guido van Rossum0e548712002-08-09 16:14:33 +0000221
222# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000223
Guido van Rossum41f95031992-03-31 19:02:01 +0000224def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000225 """Accessor for tempdir.template."""
226 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000227
Guido van Rossume888cdc2002-08-17 14:50:24 +0000228tempdir = None
229
Guido van Rossum0e548712002-08-09 16:14:33 +0000230def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000231 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000232 global tempdir
233 if tempdir is None:
234 _once_lock.acquire()
235 try:
236 if tempdir is None:
237 tempdir = _get_default_tempdir()
238 finally:
239 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000240 return tempdir
241
Guido van Rossume888cdc2002-08-17 14:50:24 +0000242def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000243 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000244 file. The return value is a pair (fd, name) where fd is the
245 file descriptor returned by os.open, and name is the filename.
246
247 If 'suffix' is specified, the file name will end with that suffix,
248 otherwise there will be no suffix.
249
250 If 'prefix' is specified, the file name will begin with that prefix,
251 otherwise a default prefix is used.
252
253 If 'dir' is specified, the file will be created in that directory,
254 otherwise a default directory is used.
255
Tim Peters04490bf2002-08-14 15:41:26 +0000256 If 'text' is specified and true, the file is opened in text
257 mode. Else (the default) the file is opened in binary mode. On
258 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000259
260 The file is readable and writable only by the creating user ID.
261 If the operating system uses permission bits to indicate whether a
262 file is executable, the file is executable by no one. The file
263 descriptor is not inherited by children of this process.
264
265 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000266 """
267
Guido van Rossume888cdc2002-08-17 14:50:24 +0000268 if dir is None:
269 dir = gettempdir()
270
Tim Peters04490bf2002-08-14 15:41:26 +0000271 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000272 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000273 else:
274 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000275
276 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000277
Guido van Rossumeee94981991-11-12 15:38:08 +0000278
Guido van Rossume888cdc2002-08-17 14:50:24 +0000279def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000280 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000281 directory. The return value is the pathname of the directory.
282
Tim Peters04490bf2002-08-14 15:41:26 +0000283 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000284 not accepted.
285
286 The directory is readable, writable, and searchable only by the
287 creating user.
288
289 Caller is responsible for deleting the directory when done with it.
290 """
291
Guido van Rossume888cdc2002-08-17 14:50:24 +0000292 if dir is None:
293 dir = gettempdir()
294
Guido van Rossum0e548712002-08-09 16:14:33 +0000295 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000296
Guido van Rossum805365e2007-05-07 22:24:25 +0000297 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000298 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000299 file = _os.path.join(dir, prefix + name + suffix)
300 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000301 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000302 return file
Florent Xicluna68f71a32011-10-28 16:06:23 +0200303 except FileExistsError:
304 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000305
Florent Xicluna68f71a32011-10-28 16:06:23 +0200306 raise FileExistsError("No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000307
Guido van Rossume888cdc2002-08-17 14:50:24 +0000308def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000309 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000310 file is not created.
311
Tim Peters04490bf2002-08-14 15:41:26 +0000312 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000313 not accepted.
314
315 This function is unsafe and should not be used. The file name
316 refers to a file that did not exist at some point, but by the time
317 you get around to creating it, someone else may have beaten you to
318 the punch.
319 """
320
Guido van Rossum44f602d2002-11-22 15:56:29 +0000321## from warnings import warn as _warn
322## _warn("mktemp is a potential security risk to your program",
323## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000324
Guido van Rossume888cdc2002-08-17 14:50:24 +0000325 if dir is None:
326 dir = gettempdir()
327
Guido van Rossum0e548712002-08-09 16:14:33 +0000328 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000329 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000330 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000331 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000332 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000333 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000334
Florent Xicluna68f71a32011-10-28 16:06:23 +0200335 raise FileExistsError("No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000336
Christian Heimes3ecfea712008-02-09 20:51:34 +0000337
Guido van Rossum0e548712002-08-09 16:14:33 +0000338class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000339 """Temporary file wrapper
340
Guido van Rossum0e548712002-08-09 16:14:33 +0000341 This class provides a wrapper around files opened for
342 temporary use. In particular, it seeks to automatically
343 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000344 """
Tim Petersa255a722001-12-18 22:32:40 +0000345
Guido van Rossumd8faa362007-04-27 19:54:29 +0000346 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000347 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000348 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000349 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000350 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000351
Guido van Rossumca549821997-08-12 18:00:12 +0000352 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000353 # Attribute lookups are delegated to the underlying file
354 # and cached for non-numeric results
355 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000356 file = self.__dict__['file']
357 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000358 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000359 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000360 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000361
Christian Heimes3ecfea712008-02-09 20:51:34 +0000362 # The underlying __enter__ method returns the wrong object
363 # (self.file) so override it to return the wrapper
364 def __enter__(self):
365 self.file.__enter__()
366 return self
367
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000368 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000369 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000370 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000371
Guido van Rossum0e548712002-08-09 16:14:33 +0000372 # NT provides delete-on-close as a primitive, so we don't need
373 # the wrapper to do anything special. We still use it so that
374 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
375 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000376 # Cache the unlinker so we don't get spurious errors at
377 # shutdown when the module-level "os" is None'd out. Note
378 # that this must be referenced as self.unlink, because the
379 # name TemporaryFileWrapper may also get None'd out before
380 # __del__ is called.
381 unlink = _os.unlink
Tim Peters1baa22af2001-01-12 10:02:46 +0000382
Guido van Rossum0e548712002-08-09 16:14:33 +0000383 def close(self):
384 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000385 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000386 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000387 if self.delete:
388 self.unlink(self.name)
Tim Peters1baa22af2001-01-12 10:02:46 +0000389
Guido van Rossum0e548712002-08-09 16:14:33 +0000390 def __del__(self):
391 self.close()
Tim Peters1baa22af2001-01-12 10:02:46 +0000392
Christian Heimes3ecfea712008-02-09 20:51:34 +0000393 # Need to trap __exit__ as well to ensure the file gets
394 # deleted when used in a with statement
395 def __exit__(self, exc, value, tb):
396 result = self.file.__exit__(exc, value, tb)
397 self.close()
398 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000399 else:
400 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000401 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000402
403
Guido van Rossumf0c74162007-08-28 03:29:45 +0000404def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
405 newline=None, suffix="", prefix=template,
406 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000407 """Create and return a temporary file.
408 Arguments:
409 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000410 'mode' -- the mode argument to io.open (default "w+b").
411 'buffering' -- the buffer size argument to io.open (default -1).
412 'encoding' -- the encoding argument to io.open (default None)
413 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000414 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000415 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000416
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000417 Returns an object with a file-like interface; the name of the file
418 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000419 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000420 """
Tim Peters1baa22af2001-01-12 10:02:46 +0000421
Guido van Rossume888cdc2002-08-17 14:50:24 +0000422 if dir is None:
423 dir = gettempdir()
424
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000425 flags = _bin_openflags
Tim Peters1baa22af2001-01-12 10:02:46 +0000426
Guido van Rossum0e548712002-08-09 16:14:33 +0000427 # Setting O_TEMPORARY in the flags causes the OS to delete
428 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000429 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000430 flags |= _os.O_TEMPORARY
Tim Peters1baa22af2001-01-12 10:02:46 +0000431
Guido van Rossum0e548712002-08-09 16:14:33 +0000432 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000433 file = _io.open(fd, mode, buffering=buffering,
434 newline=newline, encoding=encoding)
435
Guido van Rossumd8faa362007-04-27 19:54:29 +0000436 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000437
Jason Tishler80c02af2002-08-14 15:10:09 +0000438if _os.name != 'posix' or _os.sys.platform == 'cygwin':
439 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
440 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000441 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22af2001-01-12 10:02:46 +0000442
443else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000444 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
445 newline=None, suffix="", prefix=template,
446 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000447 """Create and return a temporary file.
448 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000449 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000450 'mode' -- the mode argument to io.open (default "w+b").
451 'buffering' -- the buffer size argument to io.open (default -1).
452 'encoding' -- the encoding argument to io.open (default None)
453 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000454 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000455
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000456 Returns an object with a file-like interface. The file has no
457 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000458 """
459
Guido van Rossume888cdc2002-08-17 14:50:24 +0000460 if dir is None:
461 dir = gettempdir()
462
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000463 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000464
465 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
466 try:
467 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000468 return _io.open(fd, mode, buffering=buffering,
469 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000470 except:
471 _os.close(fd)
472 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000473
474class SpooledTemporaryFile:
475 """Temporary file wrapper, specialized to switch from
476 StringIO to a real file when it exceeds a certain size or
477 when a fileno is needed.
478 """
479 _rolled = False
480
Guido van Rossumf0c74162007-08-28 03:29:45 +0000481 def __init__(self, max_size=0, mode='w+b', buffering=-1,
482 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000483 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000484 if 'b' in mode:
485 self._file = _io.BytesIO()
486 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000487 # Setting newline="\n" avoids newline translation;
488 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000489 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000490 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000491 self._max_size = max_size
492 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000493 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
494 'suffix': suffix, 'prefix': prefix,
495 'encoding': encoding, 'newline': newline,
496 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000497
498 def _check(self, file):
499 if self._rolled: return
500 max_size = self._max_size
501 if max_size and file.tell() > max_size:
502 self.rollover()
503
504 def rollover(self):
505 if self._rolled: return
506 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000507 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000508 del self._TemporaryFileArgs
509
510 newfile.write(file.getvalue())
511 newfile.seek(file.tell(), 0)
512
513 self._rolled = True
514
Christian Heimes3ecfea712008-02-09 20:51:34 +0000515 # The method caching trick from NamedTemporaryFile
516 # won't work here, because _file may change from a
517 # _StringIO instance to a real file. So we list
518 # all the methods directly.
519
520 # Context management protocol
521 def __enter__(self):
522 if self._file.closed:
523 raise ValueError("Cannot enter context with closed file")
524 return self
525
526 def __exit__(self, exc, value, tb):
527 self._file.close()
528
Guido van Rossumd8faa362007-04-27 19:54:29 +0000529 # file protocol
530 def __iter__(self):
531 return self._file.__iter__()
532
533 def close(self):
534 self._file.close()
535
536 @property
537 def closed(self):
538 return self._file.closed
539
540 @property
541 def encoding(self):
542 return self._file.encoding
543
544 def fileno(self):
545 self.rollover()
546 return self._file.fileno()
547
548 def flush(self):
549 self._file.flush()
550
551 def isatty(self):
552 return self._file.isatty()
553
554 @property
555 def mode(self):
556 return self._file.mode
557
558 @property
559 def name(self):
560 return self._file.name
561
562 @property
563 def newlines(self):
564 return self._file.newlines
565
566 def next(self):
567 return self._file.next
568
569 def read(self, *args):
570 return self._file.read(*args)
571
572 def readline(self, *args):
573 return self._file.readline(*args)
574
575 def readlines(self, *args):
576 return self._file.readlines(*args)
577
578 def seek(self, *args):
579 self._file.seek(*args)
580
581 @property
582 def softspace(self):
583 return self._file.softspace
584
585 def tell(self):
586 return self._file.tell()
587
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100588 def truncate(self, size=None):
589 if size is None:
590 self._file.truncate()
591 else:
592 if size > self._max_size:
593 self.rollover()
594 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000595
596 def write(self, s):
597 file = self._file
598 rv = file.write(s)
599 self._check(file)
600 return rv
601
602 def writelines(self, iterable):
603 file = self._file
604 rv = file.writelines(iterable)
605 self._check(file)
606 return rv
607
608 def xreadlines(self, *args):
609 return self._file.xreadlines(*args)
Nick Coghlan543af752010-10-24 11:23:25 +0000610
611
612class TemporaryDirectory(object):
613 """Create and return a temporary directory. This has the same
614 behavior as mkdtemp but can be used as a context manager. For
615 example:
616
617 with TemporaryDirectory() as tmpdir:
618 ...
619
620 Upon exiting the context, the directory and everthing contained
621 in it are removed.
622 """
623
624 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000625 self._closed = False
Andrew Svetlov737fb892012-12-18 21:14:22 +0200626 self.name = None # Handle mkdtemp raising an exception
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000627 self.name = mkdtemp(suffix, prefix, dir)
628
629 def __repr__(self):
630 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000631
632 def __enter__(self):
633 return self.name
634
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000635 def cleanup(self, _warn=False):
636 if self.name and not self._closed:
637 try:
638 self._rmtree(self.name)
639 except (TypeError, AttributeError) as ex:
640 # Issue #10188: Emit a warning on stderr
641 # if the directory could not be cleaned
642 # up due to missing globals
643 if "None" not in str(ex):
644 raise
645 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
646 file=_sys.stderr)
647 return
Nick Coghlan543af752010-10-24 11:23:25 +0000648 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000649 if _warn:
650 self._warn("Implicitly cleaning up {!r}".format(self),
651 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000652
653 def __exit__(self, exc, value, tb):
654 self.cleanup()
655
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000656 def __del__(self):
657 # Issue a ResourceWarning if implicit cleanup needed
658 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000659
660 # XXX (ncoghlan): The following code attempts to make
661 # this class tolerant of the module nulling out process
662 # that happens during CPython interpreter shutdown
663 # Alas, it doesn't actually manage it. See issue #10188
664 _listdir = staticmethod(_os.listdir)
665 _path_join = staticmethod(_os.path.join)
666 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200667 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000668 _remove = staticmethod(_os.remove)
669 _rmdir = staticmethod(_os.rmdir)
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000670 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000671
672 def _rmtree(self, path):
673 # Essentially a stripped down version of shutil.rmtree. We can't
674 # use globals because they may be None'ed out at shutdown.
675 for name in self._listdir(path):
676 fullname = self._path_join(path, name)
677 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200678 isdir = self._isdir(fullname) and not self._islink(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200679 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000680 isdir = False
681 if isdir:
682 self._rmtree(fullname)
683 else:
684 try:
685 self._remove(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200686 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000687 pass
688 try:
689 self._rmdir(path)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200690 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000691 pass