blob: 0cc5c04405a8302c79d6fe4264e9c0e1980d8993 [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
Tim Petersa0d55de2002-08-09 18:01:01 +000061if hasattr(_os, 'O_NOINHERIT'):
62 _text_openflags |= _os.O_NOINHERIT
63if hasattr(_os, 'O_NOFOLLOW'):
64 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000065
66_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000067if hasattr(_os, 'O_BINARY'):
68 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000069
70if hasattr(_os, 'TMP_MAX'):
71 TMP_MAX = _os.TMP_MAX
72else:
73 TMP_MAX = 10000
74
R David Murray3a420c72011-06-22 21:01:13 -040075# Although it does not have an underscore for historical reasons, this
76# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000077template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000078
Guido van Rossum0e548712002-08-09 16:14:33 +000079# Internal routines.
80
81_once_lock = _allocate_lock()
82
Guido van Rossumb256159392003-11-10 02:16:36 +000083if hasattr(_os, "lstat"):
84 _stat = _os.lstat
85elif hasattr(_os, "stat"):
86 _stat = _os.stat
87else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020088 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000089 # file doesn't exist.
90 def _stat(fn):
Florent Xicluna46f5d142011-10-28 21:58:56 +020091 f = open(fn)
Guido van Rossumb256159392003-11-10 02:16:36 +000092 f.close()
93
94def _exists(fn):
95 try:
96 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020097 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000098 return False
99 else:
100 return True
101
Guido van Rossum0e548712002-08-09 16:14:33 +0000102class _RandomNameSequence:
103 """An instance of _RandomNameSequence generates an endless
104 sequence of unpredictable strings which can safely be incorporated
105 into file names. Each string is six characters long. Multiple
106 threads can safely use the same instance at the same time.
107
108 _RandomNameSequence is an iterator."""
109
Raymond Hettinger572895b2010-11-09 03:43:58 +0000110 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +0000111
Antoine Pitrou4558bad2011-11-25 21:28:15 +0100112 @property
113 def rng(self):
114 cur_pid = _os.getpid()
115 if cur_pid != getattr(self, '_rng_pid', None):
116 self._rng = _Random()
117 self._rng_pid = cur_pid
118 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000119
Guido van Rossum0e548712002-08-09 16:14:33 +0000120 def __iter__(self):
121 return self
122
Georg Brandla18af4e2007-04-21 15:47:16 +0000123 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000124 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000125 choose = self.rng.choice
Raymond Hettinger572895b2010-11-09 03:43:58 +0000126 letters = [choose(c) for dummy in "123456"]
127 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000128
129def _candidate_tempdir_list():
130 """Generate a list of candidate temporary directories which
131 _get_default_tempdir will try."""
132
133 dirlist = []
134
135 # First, try the environment.
136 for envname in 'TMPDIR', 'TEMP', 'TMP':
137 dirname = _os.getenv(envname)
138 if dirname: dirlist.append(dirname)
139
140 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000141 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000142 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
143 else:
144 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
145
146 # As a last resort, the current directory.
147 try:
148 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200149 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000150 dirlist.append(_os.curdir)
151
152 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000153
Guido van Rossum0e548712002-08-09 16:14:33 +0000154def _get_default_tempdir():
155 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000156 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000157
158 We determine whether or not a candidate temp dir is usable by
159 trying to create and write to a file in that directory. If this
160 is successful, the test file is deleted. To prevent denial of
161 service, the name of the test file must be randomized."""
162
163 namer = _RandomNameSequence()
164 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000165
166 for dir in dirlist:
167 if dir != _os.curdir:
168 dir = _os.path.normcase(_os.path.abspath(dir))
169 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000170 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000171 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000172 filename = _os.path.join(dir, name)
173 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000174 fd = _os.open(filename, _bin_openflags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000175 fp = _io.open(fd, 'wb')
176 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000177 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000178 _os.unlink(filename)
179 del fp, fd
180 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200181 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000182 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200183 except OSError:
184 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200185 raise FileNotFoundError(_errno.ENOENT,
186 "No usable temporary directory found in %s" %
187 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000188
Guido van Rossume888cdc2002-08-17 14:50:24 +0000189_name_sequence = None
190
Guido van Rossum0e548712002-08-09 16:14:33 +0000191def _get_candidate_names():
192 """Common setup sequence for all user-callable interfaces."""
193
Guido van Rossume888cdc2002-08-17 14:50:24 +0000194 global _name_sequence
195 if _name_sequence is None:
196 _once_lock.acquire()
197 try:
198 if _name_sequence is None:
199 _name_sequence = _RandomNameSequence()
200 finally:
201 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000202 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000203
204
Guido van Rossum0e548712002-08-09 16:14:33 +0000205def _mkstemp_inner(dir, pre, suf, flags):
206 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000207
Guido van Rossum0e548712002-08-09 16:14:33 +0000208 names = _get_candidate_names()
209
Guido van Rossum805365e2007-05-07 22:24:25 +0000210 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000211 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000212 file = _os.path.join(dir, pre + name + suf)
213 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000214 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000215 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000216 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200217 except FileExistsError:
218 continue # try again
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
Guido van Rossum0e548712002-08-09 16:14:33 +0000307
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200308 raise FileExistsError(_errno.EEXIST,
309 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000310
Guido van Rossume888cdc2002-08-17 14:50:24 +0000311def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000312 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000313 file is not created.
314
Tim Peters04490bf2002-08-14 15:41:26 +0000315 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000316 not accepted.
317
318 This function is unsafe and should not be used. The file name
319 refers to a file that did not exist at some point, but by the time
320 you get around to creating it, someone else may have beaten you to
321 the punch.
322 """
323
Guido van Rossum44f602d2002-11-22 15:56:29 +0000324## from warnings import warn as _warn
325## _warn("mktemp is a potential security risk to your program",
326## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000327
Guido van Rossume888cdc2002-08-17 14:50:24 +0000328 if dir is None:
329 dir = gettempdir()
330
Guido van Rossum0e548712002-08-09 16:14:33 +0000331 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000332 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000333 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000334 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000335 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000336 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000337
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200338 raise FileExistsError(_errno.EEXIST,
339 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000340
Christian Heimes3ecfea712008-02-09 20:51:34 +0000341
Guido van Rossum0e548712002-08-09 16:14:33 +0000342class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000343 """Temporary file wrapper
344
Guido van Rossum0e548712002-08-09 16:14:33 +0000345 This class provides a wrapper around files opened for
346 temporary use. In particular, it seeks to automatically
347 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000348 """
Tim Petersa255a722001-12-18 22:32:40 +0000349
Guido van Rossumd8faa362007-04-27 19:54:29 +0000350 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000351 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000352 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000353 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000354 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000355
Guido van Rossumca549821997-08-12 18:00:12 +0000356 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000357 # Attribute lookups are delegated to the underlying file
358 # and cached for non-numeric results
359 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000360 file = self.__dict__['file']
361 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000362 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000363 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000364 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000365
Christian Heimes3ecfea712008-02-09 20:51:34 +0000366 # The underlying __enter__ method returns the wrong object
367 # (self.file) so override it to return the wrapper
368 def __enter__(self):
369 self.file.__enter__()
370 return self
371
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000372 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000373 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000374 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000375
Guido van Rossum0e548712002-08-09 16:14:33 +0000376 # NT provides delete-on-close as a primitive, so we don't need
377 # the wrapper to do anything special. We still use it so that
378 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
379 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000380 # Cache the unlinker so we don't get spurious errors at
381 # shutdown when the module-level "os" is None'd out. Note
382 # that this must be referenced as self.unlink, because the
383 # name TemporaryFileWrapper may also get None'd out before
384 # __del__ is called.
385 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000386
Guido van Rossum0e548712002-08-09 16:14:33 +0000387 def close(self):
388 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000389 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000390 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000391 if self.delete:
392 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000393
Guido van Rossum0e548712002-08-09 16:14:33 +0000394 def __del__(self):
395 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000396
Christian Heimes3ecfea712008-02-09 20:51:34 +0000397 # Need to trap __exit__ as well to ensure the file gets
398 # deleted when used in a with statement
399 def __exit__(self, exc, value, tb):
400 result = self.file.__exit__(exc, value, tb)
401 self.close()
402 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000403 else:
404 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000405 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000406
407
Guido van Rossumf0c74162007-08-28 03:29:45 +0000408def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
409 newline=None, suffix="", prefix=template,
410 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000411 """Create and return a temporary file.
412 Arguments:
413 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000414 'mode' -- the mode argument to io.open (default "w+b").
415 'buffering' -- the buffer size argument to io.open (default -1).
416 'encoding' -- the encoding argument to io.open (default None)
417 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000418 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000419 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000420
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000421 Returns an object with a file-like interface; the name of the file
422 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000423 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000424 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000425
Guido van Rossume888cdc2002-08-17 14:50:24 +0000426 if dir is None:
427 dir = gettempdir()
428
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000429 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000430
Guido van Rossum0e548712002-08-09 16:14:33 +0000431 # Setting O_TEMPORARY in the flags causes the OS to delete
432 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000433 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000434 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000435
Guido van Rossum0e548712002-08-09 16:14:33 +0000436 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000437 file = _io.open(fd, mode, buffering=buffering,
438 newline=newline, encoding=encoding)
439
Guido van Rossumd8faa362007-04-27 19:54:29 +0000440 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000441
Jason Tishler80c02af2002-08-14 15:10:09 +0000442if _os.name != 'posix' or _os.sys.platform == 'cygwin':
443 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
444 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000445 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000446
447else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000448 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
449 newline=None, suffix="", prefix=template,
450 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000451 """Create and return a temporary file.
452 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000453 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000454 'mode' -- the mode argument to io.open (default "w+b").
455 'buffering' -- the buffer size argument to io.open (default -1).
456 'encoding' -- the encoding argument to io.open (default None)
457 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000458 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000459
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000460 Returns an object with a file-like interface. The file has no
461 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000462 """
463
Guido van Rossume888cdc2002-08-17 14:50:24 +0000464 if dir is None:
465 dir = gettempdir()
466
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000467 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000468
469 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
470 try:
471 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000472 return _io.open(fd, mode, buffering=buffering,
473 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000474 except:
475 _os.close(fd)
476 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000477
478class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200479 """Temporary file wrapper, specialized to switch from BytesIO
480 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000481 when a fileno is needed.
482 """
483 _rolled = False
484
Guido van Rossumf0c74162007-08-28 03:29:45 +0000485 def __init__(self, max_size=0, mode='w+b', buffering=-1,
486 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000487 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000488 if 'b' in mode:
489 self._file = _io.BytesIO()
490 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000491 # Setting newline="\n" avoids newline translation;
492 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000493 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000494 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000495 self._max_size = max_size
496 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000497 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
498 'suffix': suffix, 'prefix': prefix,
499 'encoding': encoding, 'newline': newline,
500 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000501
502 def _check(self, file):
503 if self._rolled: return
504 max_size = self._max_size
505 if max_size and file.tell() > max_size:
506 self.rollover()
507
508 def rollover(self):
509 if self._rolled: return
510 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000511 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000512 del self._TemporaryFileArgs
513
514 newfile.write(file.getvalue())
515 newfile.seek(file.tell(), 0)
516
517 self._rolled = True
518
Christian Heimes3ecfea712008-02-09 20:51:34 +0000519 # The method caching trick from NamedTemporaryFile
520 # won't work here, because _file may change from a
521 # _StringIO instance to a real file. So we list
522 # all the methods directly.
523
524 # Context management protocol
525 def __enter__(self):
526 if self._file.closed:
527 raise ValueError("Cannot enter context with closed file")
528 return self
529
530 def __exit__(self, exc, value, tb):
531 self._file.close()
532
Guido van Rossumd8faa362007-04-27 19:54:29 +0000533 # file protocol
534 def __iter__(self):
535 return self._file.__iter__()
536
537 def close(self):
538 self._file.close()
539
540 @property
541 def closed(self):
542 return self._file.closed
543
544 @property
545 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200546 try:
547 return self._file.encoding
548 except AttributeError:
549 if 'b' in self._TemporaryFileArgs['mode']:
550 raise
551 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000552
553 def fileno(self):
554 self.rollover()
555 return self._file.fileno()
556
557 def flush(self):
558 self._file.flush()
559
560 def isatty(self):
561 return self._file.isatty()
562
563 @property
564 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200565 try:
566 return self._file.mode
567 except AttributeError:
568 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000569
570 @property
571 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200572 try:
573 return self._file.name
574 except AttributeError:
575 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000576
577 @property
578 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200579 try:
580 return self._file.newlines
581 except AttributeError:
582 if 'b' in self._TemporaryFileArgs['mode']:
583 raise
584 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000585
586 def read(self, *args):
587 return self._file.read(*args)
588
589 def readline(self, *args):
590 return self._file.readline(*args)
591
592 def readlines(self, *args):
593 return self._file.readlines(*args)
594
595 def seek(self, *args):
596 self._file.seek(*args)
597
598 @property
599 def softspace(self):
600 return self._file.softspace
601
602 def tell(self):
603 return self._file.tell()
604
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100605 def truncate(self, size=None):
606 if size is None:
607 self._file.truncate()
608 else:
609 if size > self._max_size:
610 self.rollover()
611 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000612
613 def write(self, s):
614 file = self._file
615 rv = file.write(s)
616 self._check(file)
617 return rv
618
619 def writelines(self, iterable):
620 file = self._file
621 rv = file.writelines(iterable)
622 self._check(file)
623 return rv
624
Nick Coghlan543af752010-10-24 11:23:25 +0000625
626class TemporaryDirectory(object):
627 """Create and return a temporary directory. This has the same
628 behavior as mkdtemp but can be used as a context manager. For
629 example:
630
631 with TemporaryDirectory() as tmpdir:
632 ...
633
634 Upon exiting the context, the directory and everthing contained
635 in it are removed.
636 """
637
638 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000639 self._closed = False
Andrew Svetlov737fb892012-12-18 21:14:22 +0200640 self.name = None # Handle mkdtemp raising an exception
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000641 self.name = mkdtemp(suffix, prefix, dir)
642
643 def __repr__(self):
644 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000645
646 def __enter__(self):
647 return self.name
648
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000649 def cleanup(self, _warn=False):
650 if self.name and not self._closed:
651 try:
652 self._rmtree(self.name)
653 except (TypeError, AttributeError) as ex:
654 # Issue #10188: Emit a warning on stderr
655 # if the directory could not be cleaned
656 # up due to missing globals
657 if "None" not in str(ex):
658 raise
659 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
660 file=_sys.stderr)
661 return
Nick Coghlan543af752010-10-24 11:23:25 +0000662 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000663 if _warn:
664 self._warn("Implicitly cleaning up {!r}".format(self),
665 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000666
667 def __exit__(self, exc, value, tb):
668 self.cleanup()
669
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000670 def __del__(self):
671 # Issue a ResourceWarning if implicit cleanup needed
672 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000673
674 # XXX (ncoghlan): The following code attempts to make
675 # this class tolerant of the module nulling out process
676 # that happens during CPython interpreter shutdown
677 # Alas, it doesn't actually manage it. See issue #10188
678 _listdir = staticmethod(_os.listdir)
679 _path_join = staticmethod(_os.path.join)
680 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200681 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000682 _remove = staticmethod(_os.remove)
683 _rmdir = staticmethod(_os.rmdir)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200684 _os_error = OSError
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000685 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000686
687 def _rmtree(self, path):
688 # Essentially a stripped down version of shutil.rmtree. We can't
689 # use globals because they may be None'ed out at shutdown.
690 for name in self._listdir(path):
691 fullname = self._path_join(path, name)
692 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200693 isdir = self._isdir(fullname) and not self._islink(fullname)
Nick Coghlan543af752010-10-24 11:23:25 +0000694 except self._os_error:
695 isdir = False
696 if isdir:
697 self._rmtree(fullname)
698 else:
699 try:
700 self._remove(fullname)
701 except self._os_error:
702 pass
703 try:
704 self._rmdir(path)
705 except self._os_error:
706 pass