blob: 226c6e6a7979f6b91cd98b5b1111c8fc7383683b [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
Yury Selivanov0b866602014-09-26 17:08:21 -04004creating temporary files and directories. All of the interfaces
5provided by this module can be used without fear of race conditions
6except for 'mktemp'. 'mktemp' is subject to race conditions and
7should not be used; it is provided for backward compatibility 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
Antoine Pitrou17c93262013-12-21 22:14:56 +010030import functools as _functools
Nick Coghlan6b22f3f2010-12-12 15:24:21 +000031import warnings as _warnings
Guido van Rossum9a634702007-07-09 10:24:45 +000032import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000033import os as _os
Serhiy Storchaka99e033b2014-01-27 11:18:27 +020034import shutil as _shutil
Serhiy Storchaka7451a722013-02-09 22:25:49 +020035import errno as _errno
Guido van Rossum0e548712002-08-09 16:14:33 +000036from random import Random as _Random
Serhiy Storchakaa28632b2014-01-27 11:21:54 +020037import weakref as _weakref
Guido van Rossum0e548712002-08-09 16:14:33 +000038
Guido van Rossumd8faa362007-04-27 19:54:29 +000039try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000040 import _thread
Brett Cannoncd171c82013-07-04 17:43:24 -040041except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000042 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000043_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000044
45_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000046if hasattr(_os, 'O_NOFOLLOW'):
47 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000048
49_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000050if hasattr(_os, 'O_BINARY'):
51 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000052
53if hasattr(_os, 'TMP_MAX'):
54 TMP_MAX = _os.TMP_MAX
55else:
56 TMP_MAX = 10000
57
R David Murray3a420c72011-06-22 21:01:13 -040058# Although it does not have an underscore for historical reasons, this
59# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000060template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000061
Guido van Rossum0e548712002-08-09 16:14:33 +000062# Internal routines.
63
64_once_lock = _allocate_lock()
65
Guido van Rossumb256159392003-11-10 02:16:36 +000066if hasattr(_os, "lstat"):
67 _stat = _os.lstat
68elif hasattr(_os, "stat"):
69 _stat = _os.stat
70else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020071 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000072 # file doesn't exist.
73 def _stat(fn):
Victor Stinnerdaf45552013-08-28 00:53:59 +020074 fd = _os.open(fn, _os.O_RDONLY)
Victor Stinner69b1e262014-03-20 08:50:52 +010075 _os.close(fd)
Guido van Rossumb256159392003-11-10 02:16:36 +000076
77def _exists(fn):
78 try:
79 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020080 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000081 return False
82 else:
83 return True
84
Guido van Rossum0e548712002-08-09 16:14:33 +000085class _RandomNameSequence:
86 """An instance of _RandomNameSequence generates an endless
87 sequence of unpredictable strings which can safely be incorporated
88 into file names. Each string is six characters long. Multiple
89 threads can safely use the same instance at the same time.
90
91 _RandomNameSequence is an iterator."""
92
Raymond Hettinger572895b2010-11-09 03:43:58 +000093 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +000094
Antoine Pitrou4558bad2011-11-25 21:28:15 +010095 @property
96 def rng(self):
97 cur_pid = _os.getpid()
98 if cur_pid != getattr(self, '_rng_pid', None):
99 self._rng = _Random()
100 self._rng_pid = cur_pid
101 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000102
Guido van Rossum0e548712002-08-09 16:14:33 +0000103 def __iter__(self):
104 return self
105
Georg Brandla18af4e2007-04-21 15:47:16 +0000106 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000107 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000108 choose = self.rng.choice
Victor Stinner97869102013-08-14 01:28:28 +0200109 letters = [choose(c) for dummy in range(8)]
Raymond Hettinger572895b2010-11-09 03:43:58 +0000110 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000111
112def _candidate_tempdir_list():
113 """Generate a list of candidate temporary directories which
114 _get_default_tempdir will try."""
115
116 dirlist = []
117
118 # First, try the environment.
119 for envname in 'TMPDIR', 'TEMP', 'TMP':
120 dirname = _os.getenv(envname)
121 if dirname: dirlist.append(dirname)
122
123 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000124 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000125 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
126 else:
127 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
128
129 # As a last resort, the current directory.
130 try:
131 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200132 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000133 dirlist.append(_os.curdir)
134
135 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000136
Guido van Rossum0e548712002-08-09 16:14:33 +0000137def _get_default_tempdir():
138 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000139 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000140
141 We determine whether or not a candidate temp dir is usable by
142 trying to create and write to a file in that directory. If this
143 is successful, the test file is deleted. To prevent denial of
144 service, the name of the test file must be randomized."""
145
146 namer = _RandomNameSequence()
147 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000148
149 for dir in dirlist:
150 if dir != _os.curdir:
Tim Golden6d09f092013-10-25 18:38:16 +0100151 dir = _os.path.abspath(dir)
Guido van Rossum0e548712002-08-09 16:14:33 +0000152 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000153 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000154 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000155 filename = _os.path.join(dir, name)
156 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000157 fd = _os.open(filename, _bin_openflags, 0o600)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200158 try:
159 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200160 with _io.open(fd, 'wb', closefd=False) as fp:
161 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200162 finally:
163 _os.close(fd)
164 finally:
165 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000166 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200167 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000168 pass
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300169 except PermissionError:
170 # This exception is thrown when a directory with the chosen name
171 # already exists on windows.
172 if (_os.name == 'nt' and _os.path.isdir(dir) and
173 _os.access(dir, _os.W_OK)):
174 continue
175 break # no point trying more names in this directory
Florent Xicluna68f71a32011-10-28 16:06:23 +0200176 except OSError:
177 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200178 raise FileNotFoundError(_errno.ENOENT,
179 "No usable temporary directory found in %s" %
180 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000181
Guido van Rossume888cdc2002-08-17 14:50:24 +0000182_name_sequence = None
183
Guido van Rossum0e548712002-08-09 16:14:33 +0000184def _get_candidate_names():
185 """Common setup sequence for all user-callable interfaces."""
186
Guido van Rossume888cdc2002-08-17 14:50:24 +0000187 global _name_sequence
188 if _name_sequence is None:
189 _once_lock.acquire()
190 try:
191 if _name_sequence is None:
192 _name_sequence = _RandomNameSequence()
193 finally:
194 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000195 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000196
197
Guido van Rossum0e548712002-08-09 16:14:33 +0000198def _mkstemp_inner(dir, pre, suf, flags):
199 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000200
Guido van Rossum0e548712002-08-09 16:14:33 +0000201 names = _get_candidate_names()
202
Guido van Rossum805365e2007-05-07 22:24:25 +0000203 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000204 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000205 file = _os.path.join(dir, pre + name + suf)
206 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000207 fd = _os.open(file, flags, 0o600)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000208 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200209 except FileExistsError:
210 continue # try again
Eli Benderskyf315df32013-09-06 06:11:19 -0700211 except PermissionError:
212 # This exception is thrown when a directory with the chosen name
213 # already exists on windows.
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300214 if (_os.name == 'nt' and _os.path.isdir(dir) and
215 _os.access(dir, _os.W_OK)):
Eli Benderskyf315df32013-09-06 06:11:19 -0700216 continue
217 else:
218 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000219
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200220 raise FileExistsError(_errno.EEXIST,
221 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000222
Guido van Rossum0e548712002-08-09 16:14:33 +0000223
224# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000225
Guido van Rossum41f95031992-03-31 19:02:01 +0000226def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000227 """Accessor for tempdir.template."""
228 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000229
Guido van Rossume888cdc2002-08-17 14:50:24 +0000230tempdir = None
231
Guido van Rossum0e548712002-08-09 16:14:33 +0000232def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000233 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000234 global tempdir
235 if tempdir is None:
236 _once_lock.acquire()
237 try:
238 if tempdir is None:
239 tempdir = _get_default_tempdir()
240 finally:
241 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000242 return tempdir
243
Guido van Rossume888cdc2002-08-17 14:50:24 +0000244def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000245 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000246 file. The return value is a pair (fd, name) where fd is the
247 file descriptor returned by os.open, and name is the filename.
248
249 If 'suffix' is specified, the file name will end with that suffix,
250 otherwise there will be no suffix.
251
252 If 'prefix' is specified, the file name will begin with that prefix,
253 otherwise a default prefix is used.
254
255 If 'dir' is specified, the file will be created in that directory,
256 otherwise a default directory is used.
257
Tim Peters04490bf2002-08-14 15:41:26 +0000258 If 'text' is specified and true, the file is opened in text
259 mode. Else (the default) the file is opened in binary mode. On
260 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000261
262 The file is readable and writable only by the creating user ID.
263 If the operating system uses permission bits to indicate whether a
264 file is executable, the file is executable by no one. The file
265 descriptor is not inherited by children of this process.
266
267 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000268 """
269
Guido van Rossume888cdc2002-08-17 14:50:24 +0000270 if dir is None:
271 dir = gettempdir()
272
Tim Peters04490bf2002-08-14 15:41:26 +0000273 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000274 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000275 else:
276 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000277
278 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000279
Guido van Rossumeee94981991-11-12 15:38:08 +0000280
Guido van Rossume888cdc2002-08-17 14:50:24 +0000281def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000282 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000283 directory. The return value is the pathname of the directory.
284
Tim Peters04490bf2002-08-14 15:41:26 +0000285 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000286 not accepted.
287
288 The directory is readable, writable, and searchable only by the
289 creating user.
290
291 Caller is responsible for deleting the directory when done with it.
292 """
293
Guido van Rossume888cdc2002-08-17 14:50:24 +0000294 if dir is None:
295 dir = gettempdir()
296
Guido van Rossum0e548712002-08-09 16:14:33 +0000297 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000298
Guido van Rossum805365e2007-05-07 22:24:25 +0000299 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000300 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000301 file = _os.path.join(dir, prefix + name + suffix)
302 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000303 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000304 return file
Florent Xicluna68f71a32011-10-28 16:06:23 +0200305 except FileExistsError:
306 continue # try again
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300307 except PermissionError:
308 # This exception is thrown when a directory with the chosen name
309 # already exists on windows.
310 if (_os.name == 'nt' and _os.path.isdir(dir) and
311 _os.access(dir, _os.W_OK)):
312 continue
313 else:
314 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000315
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200316 raise FileExistsError(_errno.EEXIST,
317 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000318
Guido van Rossume888cdc2002-08-17 14:50:24 +0000319def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000320 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000321 file is not created.
322
Tim Peters04490bf2002-08-14 15:41:26 +0000323 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000324 not accepted.
325
326 This function is unsafe and should not be used. The file name
327 refers to a file that did not exist at some point, but by the time
328 you get around to creating it, someone else may have beaten you to
329 the punch.
330 """
331
Guido van Rossum44f602d2002-11-22 15:56:29 +0000332## from warnings import warn as _warn
333## _warn("mktemp is a potential security risk to your program",
334## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000335
Guido van Rossume888cdc2002-08-17 14:50:24 +0000336 if dir is None:
337 dir = gettempdir()
338
Guido van Rossum0e548712002-08-09 16:14:33 +0000339 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000340 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000341 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000342 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000343 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000344 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000345
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200346 raise FileExistsError(_errno.EEXIST,
347 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000348
Christian Heimes3ecfea712008-02-09 20:51:34 +0000349
Antoine Pitrou17c93262013-12-21 22:14:56 +0100350class _TemporaryFileCloser:
351 """A separate object allowing proper closing of a temporary file's
352 underlying file object, without adding a __del__ method to the
353 temporary file."""
Tim Petersa255a722001-12-18 22:32:40 +0000354
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200355 file = None # Set here since __del__ checks it
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200356 close_called = False
357
Guido van Rossumd8faa362007-04-27 19:54:29 +0000358 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000359 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000360 self.name = name
Guido van Rossumd8faa362007-04-27 19:54:29 +0000361 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000362
Guido van Rossum0e548712002-08-09 16:14:33 +0000363 # NT provides delete-on-close as a primitive, so we don't need
364 # the wrapper to do anything special. We still use it so that
365 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
366 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000367 # Cache the unlinker so we don't get spurious errors at
368 # shutdown when the module-level "os" is None'd out. Note
369 # that this must be referenced as self.unlink, because the
370 # name TemporaryFileWrapper may also get None'd out before
371 # __del__ is called.
Tim Peters1baa22a2001-01-12 10:02:46 +0000372
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200373 def close(self, unlink=_os.unlink):
374 if not self.close_called and self.file is not None:
Tim Peters6ef966e2002-11-21 15:48:33 +0000375 self.close_called = True
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300376 try:
377 self.file.close()
378 finally:
379 if self.delete:
380 unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000381
Antoine Pitrou17c93262013-12-21 22:14:56 +0100382 # Need to ensure the file is deleted on __del__
Guido van Rossum0e548712002-08-09 16:14:33 +0000383 def __del__(self):
384 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000385
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000386 else:
Antoine Pitrou17c93262013-12-21 22:14:56 +0100387 def close(self):
388 if not self.close_called:
389 self.close_called = True
390 self.file.close()
391
392
393class _TemporaryFileWrapper:
394 """Temporary file wrapper
395
396 This class provides a wrapper around files opened for
397 temporary use. In particular, it seeks to automatically
398 remove the file when it is no longer needed.
399 """
400
401 def __init__(self, file, name, delete=True):
402 self.file = file
403 self.name = name
404 self.delete = delete
405 self._closer = _TemporaryFileCloser(file, name, delete)
406
407 def __getattr__(self, name):
408 # Attribute lookups are delegated to the underlying file
409 # and cached for non-numeric results
410 # (i.e. methods are cached, closed and friends are not)
411 file = self.__dict__['file']
412 a = getattr(file, name)
413 if hasattr(a, '__call__'):
414 func = a
415 @_functools.wraps(func)
416 def func_wrapper(*args, **kwargs):
417 return func(*args, **kwargs)
418 # Avoid closing the file as long as the wrapper is alive,
419 # see issue #18879.
420 func_wrapper._closer = self._closer
421 a = func_wrapper
422 if not isinstance(a, int):
423 setattr(self, name, a)
424 return a
425
426 # The underlying __enter__ method returns the wrong object
427 # (self.file) so override it to return the wrapper
428 def __enter__(self):
429 self.file.__enter__()
430 return self
431
432 # Need to trap __exit__ as well to ensure the file gets
433 # deleted when used in a with statement
434 def __exit__(self, exc, value, tb):
435 result = self.file.__exit__(exc, value, tb)
436 self.close()
437 return result
438
439 def close(self):
440 """
441 Close the temporary file, possibly deleting it.
442 """
443 self._closer.close()
444
445 # iter() doesn't use __getattr__ to find the __iter__ method
446 def __iter__(self):
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200447 # Don't return iter(self.file), but yield from it to avoid closing
R David Murray75ed90a2015-03-22 12:33:46 -0400448 # file as long as it's being used as iterator (see issue #23700). We
449 # can't use 'yield from' here because iter(file) returns the file
450 # object itself, which has a close method, and thus the file would get
451 # closed when the generator is finalized, due to PEP380 semantics.
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200452 for line in self.file:
453 yield line
Christian Heimes3ecfea712008-02-09 20:51:34 +0000454
455
Guido van Rossumf0c74162007-08-28 03:29:45 +0000456def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
457 newline=None, suffix="", prefix=template,
458 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000459 """Create and return a temporary file.
460 Arguments:
461 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000462 'mode' -- the mode argument to io.open (default "w+b").
463 'buffering' -- the buffer size argument to io.open (default -1).
464 'encoding' -- the encoding argument to io.open (default None)
465 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000466 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000467 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000468
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000469 Returns an object with a file-like interface; the name of the file
470 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000471 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000472 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000473
Guido van Rossume888cdc2002-08-17 14:50:24 +0000474 if dir is None:
475 dir = gettempdir()
476
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000477 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000478
Guido van Rossum0e548712002-08-09 16:14:33 +0000479 # Setting O_TEMPORARY in the flags causes the OS to delete
480 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000481 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000482 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000483
Guido van Rossum0e548712002-08-09 16:14:33 +0000484 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100485 try:
486 file = _io.open(fd, mode, buffering=buffering,
487 newline=newline, encoding=encoding)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000488
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100489 return _TemporaryFileWrapper(file, name, delete)
490 except Exception:
491 _os.close(fd)
492 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000493
Jason Tishler80c02af2002-08-14 15:10:09 +0000494if _os.name != 'posix' or _os.sys.platform == 'cygwin':
495 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
496 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000497 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000498
499else:
Victor Stinnerd967fc92014-06-05 14:27:45 +0200500 # Is the O_TMPFILE flag available and does it work?
501 # The flag is set to False if os.open(dir, os.O_TMPFILE) raises an
502 # IsADirectoryError exception
503 _O_TMPFILE_WORKS = hasattr(_os, 'O_TMPFILE')
504
Guido van Rossumf0c74162007-08-28 03:29:45 +0000505 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
506 newline=None, suffix="", prefix=template,
507 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000508 """Create and return a temporary file.
509 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000510 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000511 'mode' -- the mode argument to io.open (default "w+b").
512 'buffering' -- the buffer size argument to io.open (default -1).
513 'encoding' -- the encoding argument to io.open (default None)
514 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000515 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000516
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000517 Returns an object with a file-like interface. The file has no
518 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000519 """
Victor Stinnerd967fc92014-06-05 14:27:45 +0200520 global _O_TMPFILE_WORKS
Guido van Rossum0e548712002-08-09 16:14:33 +0000521
Guido van Rossume888cdc2002-08-17 14:50:24 +0000522 if dir is None:
523 dir = gettempdir()
524
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000525 flags = _bin_openflags
Victor Stinnerd967fc92014-06-05 14:27:45 +0200526 if _O_TMPFILE_WORKS:
527 try:
528 flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT
529 fd = _os.open(dir, flags2, 0o600)
530 except IsADirectoryError:
531 # Linux kernel older than 3.11 ignores O_TMPFILE flag.
Victor Stinner350985d2014-06-09 00:05:47 +0200532 # Set flag to False to not try again.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200533 _O_TMPFILE_WORKS = False
534 except OSError:
535 # The filesystem of the directory does not support O_TMPFILE.
536 # For example, OSError(95, 'Operation not supported').
537 pass
538 else:
539 try:
540 return _io.open(fd, mode, buffering=buffering,
541 newline=newline, encoding=encoding)
542 except:
543 _os.close(fd)
544 raise
545 # Fallback to _mkstemp_inner().
Guido van Rossum0e548712002-08-09 16:14:33 +0000546
547 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
548 try:
549 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000550 return _io.open(fd, mode, buffering=buffering,
551 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000552 except:
553 _os.close(fd)
554 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000555
556class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200557 """Temporary file wrapper, specialized to switch from BytesIO
558 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000559 when a fileno is needed.
560 """
561 _rolled = False
562
Guido van Rossumf0c74162007-08-28 03:29:45 +0000563 def __init__(self, max_size=0, mode='w+b', buffering=-1,
564 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000565 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000566 if 'b' in mode:
567 self._file = _io.BytesIO()
568 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000569 # Setting newline="\n" avoids newline translation;
570 # this is important because otherwise on Windows we'd
Yury Selivanov0b866602014-09-26 17:08:21 -0400571 # get double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000572 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000573 self._max_size = max_size
574 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000575 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
576 'suffix': suffix, 'prefix': prefix,
577 'encoding': encoding, 'newline': newline,
578 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000579
580 def _check(self, file):
581 if self._rolled: return
582 max_size = self._max_size
583 if max_size and file.tell() > max_size:
584 self.rollover()
585
586 def rollover(self):
587 if self._rolled: return
588 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000589 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000590 del self._TemporaryFileArgs
591
592 newfile.write(file.getvalue())
593 newfile.seek(file.tell(), 0)
594
595 self._rolled = True
596
Christian Heimes3ecfea712008-02-09 20:51:34 +0000597 # The method caching trick from NamedTemporaryFile
598 # won't work here, because _file may change from a
Serhiy Storchaka50254c52013-08-29 11:35:43 +0300599 # BytesIO/StringIO instance to a real file. So we list
Christian Heimes3ecfea712008-02-09 20:51:34 +0000600 # all the methods directly.
601
602 # Context management protocol
603 def __enter__(self):
604 if self._file.closed:
605 raise ValueError("Cannot enter context with closed file")
606 return self
607
608 def __exit__(self, exc, value, tb):
609 self._file.close()
610
Guido van Rossumd8faa362007-04-27 19:54:29 +0000611 # file protocol
612 def __iter__(self):
613 return self._file.__iter__()
614
615 def close(self):
616 self._file.close()
617
618 @property
619 def closed(self):
620 return self._file.closed
621
622 @property
623 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200624 try:
625 return self._file.encoding
626 except AttributeError:
627 if 'b' in self._TemporaryFileArgs['mode']:
628 raise
629 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000630
631 def fileno(self):
632 self.rollover()
633 return self._file.fileno()
634
635 def flush(self):
636 self._file.flush()
637
638 def isatty(self):
639 return self._file.isatty()
640
641 @property
642 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200643 try:
644 return self._file.mode
645 except AttributeError:
646 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000647
648 @property
649 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200650 try:
651 return self._file.name
652 except AttributeError:
653 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000654
655 @property
656 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200657 try:
658 return self._file.newlines
659 except AttributeError:
660 if 'b' in self._TemporaryFileArgs['mode']:
661 raise
662 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000663
664 def read(self, *args):
665 return self._file.read(*args)
666
667 def readline(self, *args):
668 return self._file.readline(*args)
669
670 def readlines(self, *args):
671 return self._file.readlines(*args)
672
673 def seek(self, *args):
674 self._file.seek(*args)
675
676 @property
677 def softspace(self):
678 return self._file.softspace
679
680 def tell(self):
681 return self._file.tell()
682
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100683 def truncate(self, size=None):
684 if size is None:
685 self._file.truncate()
686 else:
687 if size > self._max_size:
688 self.rollover()
689 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000690
691 def write(self, s):
692 file = self._file
693 rv = file.write(s)
694 self._check(file)
695 return rv
696
697 def writelines(self, iterable):
698 file = self._file
699 rv = file.writelines(iterable)
700 self._check(file)
701 return rv
702
Nick Coghlan543af752010-10-24 11:23:25 +0000703
704class TemporaryDirectory(object):
705 """Create and return a temporary directory. This has the same
706 behavior as mkdtemp but can be used as a context manager. For
707 example:
708
709 with TemporaryDirectory() as tmpdir:
710 ...
711
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300712 Upon exiting the context, the directory and everything contained
Nick Coghlan543af752010-10-24 11:23:25 +0000713 in it are removed.
714 """
715
716 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000717 self.name = mkdtemp(suffix, prefix, dir)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200718 self._finalizer = _weakref.finalize(
719 self, self._cleanup, self.name,
720 warn_message="Implicitly cleaning up {!r}".format(self))
721
722 @classmethod
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300723 def _cleanup(cls, name, warn_message):
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200724 _shutil.rmtree(name)
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300725 _warnings.warn(warn_message, ResourceWarning)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200726
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000727
728 def __repr__(self):
729 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000730
731 def __enter__(self):
732 return self.name
733
Nick Coghlan543af752010-10-24 11:23:25 +0000734 def __exit__(self, exc, value, tb):
735 self.cleanup()
736
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200737 def cleanup(self):
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300738 if self._finalizer.detach():
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200739 _shutil.rmtree(self.name)