blob: 908533f85d9b494e47e4f135f2c155555e94a710 [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
Serhiy Storchaka7451a722013-02-09 22:25:49 +020034import errno as _errno
Guido van Rossum0e548712002-08-09 16:14:33 +000035from random import Random as _Random
36
Guido van Rossumd8faa362007-04-27 19:54:29 +000037try:
Guido van Rossum0e548712002-08-09 16:14:33 +000038 import fcntl as _fcntl
Tim Peters90ee7eb2004-07-18 23:58:17 +000039except ImportError:
Tim Peters291f14e2003-07-22 02:50:01 +000040 def _set_cloexec(fd):
41 pass
42else:
Guido van Rossum0e548712002-08-09 16:14:33 +000043 def _set_cloexec(fd):
Tim Peters90ee7eb2004-07-18 23:58:17 +000044 try:
45 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
Florent Xicluna68f71a32011-10-28 16:06:23 +020046 except OSError:
Tim Peters90ee7eb2004-07-18 23:58:17 +000047 pass
Alex Martellif09994e2003-11-09 16:44:09 +000048 else:
Guido van Rossum0e548712002-08-09 16:14:33 +000049 # flags read successfully, modify
50 flags |= _fcntl.FD_CLOEXEC
51 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
Tim Peters291f14e2003-07-22 02:50:01 +000052
Guido van Rossum0e548712002-08-09 16:14:33 +000053
54try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000055 import _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000056except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000057 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000058_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000059
60_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Charles-François Natalib9a76e22013-01-04 18:33:02 +010061if hasattr(_os, 'O_CLOEXEC'):
62 _text_openflags |= _os.O_CLOEXEC
Tim Petersa0d55de2002-08-09 18:01:01 +000063if hasattr(_os, 'O_NOINHERIT'):
64 _text_openflags |= _os.O_NOINHERIT
65if hasattr(_os, 'O_NOFOLLOW'):
66 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000067
68_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000069if hasattr(_os, 'O_BINARY'):
70 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000071
72if hasattr(_os, 'TMP_MAX'):
73 TMP_MAX = _os.TMP_MAX
74else:
75 TMP_MAX = 10000
76
R David Murray3a420c72011-06-22 21:01:13 -040077# Although it does not have an underscore for historical reasons, this
78# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000079template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000080
Guido van Rossum0e548712002-08-09 16:14:33 +000081# Internal routines.
82
83_once_lock = _allocate_lock()
84
Guido van Rossumb256159392003-11-10 02:16:36 +000085if hasattr(_os, "lstat"):
86 _stat = _os.lstat
87elif hasattr(_os, "stat"):
88 _stat = _os.stat
89else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020090 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000091 # file doesn't exist.
92 def _stat(fn):
Florent Xicluna46f5d142011-10-28 21:58:56 +020093 f = open(fn)
Guido van Rossumb256159392003-11-10 02:16:36 +000094 f.close()
95
96def _exists(fn):
97 try:
98 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020099 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +0000100 return False
101 else:
102 return True
103
Guido van Rossum0e548712002-08-09 16:14:33 +0000104class _RandomNameSequence:
105 """An instance of _RandomNameSequence generates an endless
106 sequence of unpredictable strings which can safely be incorporated
107 into file names. Each string is six characters long. Multiple
108 threads can safely use the same instance at the same time.
109
110 _RandomNameSequence is an iterator."""
111
Raymond Hettinger572895b2010-11-09 03:43:58 +0000112 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +0000113
Antoine Pitrou4558bad2011-11-25 21:28:15 +0100114 @property
115 def rng(self):
116 cur_pid = _os.getpid()
117 if cur_pid != getattr(self, '_rng_pid', None):
118 self._rng = _Random()
119 self._rng_pid = cur_pid
120 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000121
Guido van Rossum0e548712002-08-09 16:14:33 +0000122 def __iter__(self):
123 return self
124
Georg Brandla18af4e2007-04-21 15:47:16 +0000125 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000126 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000127 choose = self.rng.choice
Raymond Hettinger572895b2010-11-09 03:43:58 +0000128 letters = [choose(c) for dummy in "123456"]
129 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000130
131def _candidate_tempdir_list():
132 """Generate a list of candidate temporary directories which
133 _get_default_tempdir will try."""
134
135 dirlist = []
136
137 # First, try the environment.
138 for envname in 'TMPDIR', 'TEMP', 'TMP':
139 dirname = _os.getenv(envname)
140 if dirname: dirlist.append(dirname)
141
142 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000143 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000144 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
145 else:
146 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
147
148 # As a last resort, the current directory.
149 try:
150 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200151 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000152 dirlist.append(_os.curdir)
153
154 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000155
Guido van Rossum0e548712002-08-09 16:14:33 +0000156def _get_default_tempdir():
157 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000158 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000159
160 We determine whether or not a candidate temp dir is usable by
161 trying to create and write to a file in that directory. If this
162 is successful, the test file is deleted. To prevent denial of
163 service, the name of the test file must be randomized."""
164
165 namer = _RandomNameSequence()
166 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000167
168 for dir in dirlist:
169 if dir != _os.curdir:
170 dir = _os.path.normcase(_os.path.abspath(dir))
171 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000172 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000173 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000174 filename = _os.path.join(dir, name)
175 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000176 fd = _os.open(filename, _bin_openflags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000177 fp = _io.open(fd, 'wb')
178 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000179 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000180 _os.unlink(filename)
181 del fp, fd
182 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200183 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000184 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200185 except OSError:
186 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200187 raise FileNotFoundError(_errno.ENOENT,
188 "No usable temporary directory found in %s" %
189 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))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200219 except FileExistsError:
220 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000221
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200222 raise FileExistsError(_errno.EEXIST,
223 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000224
Guido van Rossum0e548712002-08-09 16:14:33 +0000225
226# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000227
Guido van Rossum41f95031992-03-31 19:02:01 +0000228def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000229 """Accessor for tempdir.template."""
230 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000231
Guido van Rossume888cdc2002-08-17 14:50:24 +0000232tempdir = None
233
Guido van Rossum0e548712002-08-09 16:14:33 +0000234def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000235 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000236 global tempdir
237 if tempdir is None:
238 _once_lock.acquire()
239 try:
240 if tempdir is None:
241 tempdir = _get_default_tempdir()
242 finally:
243 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000244 return tempdir
245
Guido van Rossume888cdc2002-08-17 14:50:24 +0000246def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000247 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000248 file. The return value is a pair (fd, name) where fd is the
249 file descriptor returned by os.open, and name is the filename.
250
251 If 'suffix' is specified, the file name will end with that suffix,
252 otherwise there will be no suffix.
253
254 If 'prefix' is specified, the file name will begin with that prefix,
255 otherwise a default prefix is used.
256
257 If 'dir' is specified, the file will be created in that directory,
258 otherwise a default directory is used.
259
Tim Peters04490bf2002-08-14 15:41:26 +0000260 If 'text' is specified and true, the file is opened in text
261 mode. Else (the default) the file is opened in binary mode. On
262 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000263
264 The file is readable and writable only by the creating user ID.
265 If the operating system uses permission bits to indicate whether a
266 file is executable, the file is executable by no one. The file
267 descriptor is not inherited by children of this process.
268
269 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000270 """
271
Guido van Rossume888cdc2002-08-17 14:50:24 +0000272 if dir is None:
273 dir = gettempdir()
274
Tim Peters04490bf2002-08-14 15:41:26 +0000275 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000276 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000277 else:
278 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000279
280 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000281
Guido van Rossumeee94981991-11-12 15:38:08 +0000282
Guido van Rossume888cdc2002-08-17 14:50:24 +0000283def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000284 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000285 directory. The return value is the pathname of the directory.
286
Tim Peters04490bf2002-08-14 15:41:26 +0000287 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000288 not accepted.
289
290 The directory is readable, writable, and searchable only by the
291 creating user.
292
293 Caller is responsible for deleting the directory when done with it.
294 """
295
Guido van Rossume888cdc2002-08-17 14:50:24 +0000296 if dir is None:
297 dir = gettempdir()
298
Guido van Rossum0e548712002-08-09 16:14:33 +0000299 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000300
Guido van Rossum805365e2007-05-07 22:24:25 +0000301 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000302 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000303 file = _os.path.join(dir, prefix + name + suffix)
304 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000305 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000306 return file
Florent Xicluna68f71a32011-10-28 16:06:23 +0200307 except FileExistsError:
308 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000309
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200310 raise FileExistsError(_errno.EEXIST,
311 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000312
Guido van Rossume888cdc2002-08-17 14:50:24 +0000313def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000314 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000315 file is not created.
316
Tim Peters04490bf2002-08-14 15:41:26 +0000317 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000318 not accepted.
319
320 This function is unsafe and should not be used. The file name
321 refers to a file that did not exist at some point, but by the time
322 you get around to creating it, someone else may have beaten you to
323 the punch.
324 """
325
Guido van Rossum44f602d2002-11-22 15:56:29 +0000326## from warnings import warn as _warn
327## _warn("mktemp is a potential security risk to your program",
328## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000329
Guido van Rossume888cdc2002-08-17 14:50:24 +0000330 if dir is None:
331 dir = gettempdir()
332
Guido van Rossum0e548712002-08-09 16:14:33 +0000333 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000334 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000335 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000336 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000337 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000338 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000339
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200340 raise FileExistsError(_errno.EEXIST,
341 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000342
Christian Heimes3ecfea712008-02-09 20:51:34 +0000343
Guido van Rossum0e548712002-08-09 16:14:33 +0000344class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000345 """Temporary file wrapper
346
Guido van Rossum0e548712002-08-09 16:14:33 +0000347 This class provides a wrapper around files opened for
348 temporary use. In particular, it seeks to automatically
349 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000350 """
Tim Petersa255a722001-12-18 22:32:40 +0000351
Guido van Rossumd8faa362007-04-27 19:54:29 +0000352 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000353 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000354 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000355 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000356 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000357
Guido van Rossumca549821997-08-12 18:00:12 +0000358 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000359 # Attribute lookups are delegated to the underlying file
360 # and cached for non-numeric results
361 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000362 file = self.__dict__['file']
363 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000364 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000365 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000366 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000367
Christian Heimes3ecfea712008-02-09 20:51:34 +0000368 # The underlying __enter__ method returns the wrong object
369 # (self.file) so override it to return the wrapper
370 def __enter__(self):
371 self.file.__enter__()
372 return self
373
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000374 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000375 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000376 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000377
Guido van Rossum0e548712002-08-09 16:14:33 +0000378 # NT provides delete-on-close as a primitive, so we don't need
379 # the wrapper to do anything special. We still use it so that
380 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
381 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000382 # Cache the unlinker so we don't get spurious errors at
383 # shutdown when the module-level "os" is None'd out. Note
384 # that this must be referenced as self.unlink, because the
385 # name TemporaryFileWrapper may also get None'd out before
386 # __del__ is called.
387 unlink = _os.unlink
Tim Peters1baa22af2001-01-12 10:02:46 +0000388
Guido van Rossum0e548712002-08-09 16:14:33 +0000389 def close(self):
390 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000391 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000392 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000393 if self.delete:
394 self.unlink(self.name)
Tim Peters1baa22af2001-01-12 10:02:46 +0000395
Guido van Rossum0e548712002-08-09 16:14:33 +0000396 def __del__(self):
397 self.close()
Tim Peters1baa22af2001-01-12 10:02:46 +0000398
Christian Heimes3ecfea712008-02-09 20:51:34 +0000399 # Need to trap __exit__ as well to ensure the file gets
400 # deleted when used in a with statement
401 def __exit__(self, exc, value, tb):
402 result = self.file.__exit__(exc, value, tb)
403 self.close()
404 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000405 else:
406 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000407 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000408
409
Guido van Rossumf0c74162007-08-28 03:29:45 +0000410def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
411 newline=None, suffix="", prefix=template,
412 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000413 """Create and return a temporary file.
414 Arguments:
415 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000416 'mode' -- the mode argument to io.open (default "w+b").
417 'buffering' -- the buffer size argument to io.open (default -1).
418 'encoding' -- the encoding argument to io.open (default None)
419 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000420 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000421 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000422
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000423 Returns an object with a file-like interface; the name of the file
424 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000425 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000426 """
Tim Peters1baa22af2001-01-12 10:02:46 +0000427
Guido van Rossume888cdc2002-08-17 14:50:24 +0000428 if dir is None:
429 dir = gettempdir()
430
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000431 flags = _bin_openflags
Tim Peters1baa22af2001-01-12 10:02:46 +0000432
Guido van Rossum0e548712002-08-09 16:14:33 +0000433 # Setting O_TEMPORARY in the flags causes the OS to delete
434 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000435 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000436 flags |= _os.O_TEMPORARY
Tim Peters1baa22af2001-01-12 10:02:46 +0000437
Guido van Rossum0e548712002-08-09 16:14:33 +0000438 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000439 file = _io.open(fd, mode, buffering=buffering,
440 newline=newline, encoding=encoding)
441
Guido van Rossumd8faa362007-04-27 19:54:29 +0000442 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000443
Jason Tishler80c02af2002-08-14 15:10:09 +0000444if _os.name != 'posix' or _os.sys.platform == 'cygwin':
445 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
446 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000447 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22af2001-01-12 10:02:46 +0000448
449else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000450 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
451 newline=None, suffix="", prefix=template,
452 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000453 """Create and return a temporary file.
454 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000455 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000456 'mode' -- the mode argument to io.open (default "w+b").
457 'buffering' -- the buffer size argument to io.open (default -1).
458 'encoding' -- the encoding argument to io.open (default None)
459 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000460 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000461
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000462 Returns an object with a file-like interface. The file has no
463 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000464 """
465
Guido van Rossume888cdc2002-08-17 14:50:24 +0000466 if dir is None:
467 dir = gettempdir()
468
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000469 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000470
471 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
472 try:
473 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000474 return _io.open(fd, mode, buffering=buffering,
475 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000476 except:
477 _os.close(fd)
478 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000479
480class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200481 """Temporary file wrapper, specialized to switch from BytesIO
482 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000483 when a fileno is needed.
484 """
485 _rolled = False
486
Guido van Rossumf0c74162007-08-28 03:29:45 +0000487 def __init__(self, max_size=0, mode='w+b', buffering=-1,
488 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000489 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000490 if 'b' in mode:
491 self._file = _io.BytesIO()
492 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000493 # Setting newline="\n" avoids newline translation;
494 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000495 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000496 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000497 self._max_size = max_size
498 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000499 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
500 'suffix': suffix, 'prefix': prefix,
501 'encoding': encoding, 'newline': newline,
502 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000503
504 def _check(self, file):
505 if self._rolled: return
506 max_size = self._max_size
507 if max_size and file.tell() > max_size:
508 self.rollover()
509
510 def rollover(self):
511 if self._rolled: return
512 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000513 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000514 del self._TemporaryFileArgs
515
516 newfile.write(file.getvalue())
517 newfile.seek(file.tell(), 0)
518
519 self._rolled = True
520
Christian Heimes3ecfea712008-02-09 20:51:34 +0000521 # The method caching trick from NamedTemporaryFile
522 # won't work here, because _file may change from a
523 # _StringIO instance to a real file. So we list
524 # all the methods directly.
525
526 # Context management protocol
527 def __enter__(self):
528 if self._file.closed:
529 raise ValueError("Cannot enter context with closed file")
530 return self
531
532 def __exit__(self, exc, value, tb):
533 self._file.close()
534
Guido van Rossumd8faa362007-04-27 19:54:29 +0000535 # file protocol
536 def __iter__(self):
537 return self._file.__iter__()
538
539 def close(self):
540 self._file.close()
541
542 @property
543 def closed(self):
544 return self._file.closed
545
546 @property
547 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200548 try:
549 return self._file.encoding
550 except AttributeError:
551 if 'b' in self._TemporaryFileArgs['mode']:
552 raise
553 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000554
555 def fileno(self):
556 self.rollover()
557 return self._file.fileno()
558
559 def flush(self):
560 self._file.flush()
561
562 def isatty(self):
563 return self._file.isatty()
564
565 @property
566 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200567 try:
568 return self._file.mode
569 except AttributeError:
570 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000571
572 @property
573 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200574 try:
575 return self._file.name
576 except AttributeError:
577 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000578
579 @property
580 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200581 try:
582 return self._file.newlines
583 except AttributeError:
584 if 'b' in self._TemporaryFileArgs['mode']:
585 raise
586 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000587
588 def read(self, *args):
589 return self._file.read(*args)
590
591 def readline(self, *args):
592 return self._file.readline(*args)
593
594 def readlines(self, *args):
595 return self._file.readlines(*args)
596
597 def seek(self, *args):
598 self._file.seek(*args)
599
600 @property
601 def softspace(self):
602 return self._file.softspace
603
604 def tell(self):
605 return self._file.tell()
606
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100607 def truncate(self, size=None):
608 if size is None:
609 self._file.truncate()
610 else:
611 if size > self._max_size:
612 self.rollover()
613 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000614
615 def write(self, s):
616 file = self._file
617 rv = file.write(s)
618 self._check(file)
619 return rv
620
621 def writelines(self, iterable):
622 file = self._file
623 rv = file.writelines(iterable)
624 self._check(file)
625 return rv
626
Nick Coghlan543af752010-10-24 11:23:25 +0000627
628class TemporaryDirectory(object):
629 """Create and return a temporary directory. This has the same
630 behavior as mkdtemp but can be used as a context manager. For
631 example:
632
633 with TemporaryDirectory() as tmpdir:
634 ...
635
636 Upon exiting the context, the directory and everthing contained
637 in it are removed.
638 """
639
640 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000641 self._closed = False
Andrew Svetlov737fb892012-12-18 21:14:22 +0200642 self.name = None # Handle mkdtemp raising an exception
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000643 self.name = mkdtemp(suffix, prefix, dir)
644
645 def __repr__(self):
646 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000647
648 def __enter__(self):
649 return self.name
650
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000651 def cleanup(self, _warn=False):
652 if self.name and not self._closed:
653 try:
654 self._rmtree(self.name)
655 except (TypeError, AttributeError) as ex:
656 # Issue #10188: Emit a warning on stderr
657 # if the directory could not be cleaned
658 # up due to missing globals
659 if "None" not in str(ex):
660 raise
661 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
662 file=_sys.stderr)
663 return
Nick Coghlan543af752010-10-24 11:23:25 +0000664 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000665 if _warn:
666 self._warn("Implicitly cleaning up {!r}".format(self),
667 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000668
669 def __exit__(self, exc, value, tb):
670 self.cleanup()
671
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000672 def __del__(self):
673 # Issue a ResourceWarning if implicit cleanup needed
674 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000675
676 # XXX (ncoghlan): The following code attempts to make
677 # this class tolerant of the module nulling out process
678 # that happens during CPython interpreter shutdown
679 # Alas, it doesn't actually manage it. See issue #10188
680 _listdir = staticmethod(_os.listdir)
681 _path_join = staticmethod(_os.path.join)
682 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200683 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000684 _remove = staticmethod(_os.remove)
685 _rmdir = staticmethod(_os.rmdir)
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000686 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000687
688 def _rmtree(self, path):
689 # Essentially a stripped down version of shutil.rmtree. We can't
690 # use globals because they may be None'ed out at shutdown.
691 for name in self._listdir(path):
692 fullname = self._path_join(path, name)
693 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200694 isdir = self._isdir(fullname) and not self._islink(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200695 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000696 isdir = False
697 if isdir:
698 self._rmtree(fullname)
699 else:
700 try:
701 self._remove(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200702 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000703 pass
704 try:
705 self._rmdir(path)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200706 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000707 pass