blob: 39ebf5a943ea83d682a2eb527d2185fed43e8c7c [file] [log] [blame]
Guido van Rossum0e548712002-08-09 16:14:33 +00001"""Temporary files.
Guido van Rossume7b146f2000-02-04 15:28:42 +00002
Guido van Rossum0e548712002-08-09 16:14:33 +00003This module provides generic, low- and high-level interfaces for
4creating temporary files and directories. The interfaces listed
5as "safe" just below can be used without fear of race conditions.
6Those listed as "unsafe" cannot, and are provided for backward
7compatibility only.
Guido van Rossumeee94981991-11-12 15:38:08 +00008
Guido van Rossum0e548712002-08-09 16:14:33 +00009This module also provides some data items to the user:
Guido van Rossumeee94981991-11-12 15:38:08 +000010
Guido van Rossum0e548712002-08-09 16:14:33 +000011 TMP_MAX - maximum number of names that will be tried before
12 giving up.
Guido van Rossum0e548712002-08-09 16:14:33 +000013 tempdir - If this is set to a string before the first use of
14 any routine from this module, it will be considered as
15 another candidate location to store temporary files.
16"""
Skip Montanaro40fc1602001-03-01 04:27:19 +000017
Guido van Rossum0e548712002-08-09 16:14:33 +000018__all__ = [
19 "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
Nick Coghlan543af752010-10-24 11:23:25 +000020 "SpooledTemporaryFile", "TemporaryDirectory",
Guido van Rossum0e548712002-08-09 16:14:33 +000021 "mkstemp", "mkdtemp", # low level safe interfaces
22 "mktemp", # deprecated unsafe interface
23 "TMP_MAX", "gettempprefix", # constants
24 "tempdir", "gettempdir"
25 ]
Guido van Rossum41f95031992-03-31 19:02:01 +000026
Tim Peters4fd5a062002-01-28 23:11:23 +000027
Guido van Rossum0e548712002-08-09 16:14:33 +000028# Imports.
Tim Peters4fd5a062002-01-28 23:11:23 +000029
Nick Coghlan6b22f3f2010-12-12 15:24:21 +000030import warnings as _warnings
31import sys as _sys
Guido van Rossum9a634702007-07-09 10:24:45 +000032import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000033import os as _os
Guido van Rossum0e548712002-08-09 16:14:33 +000034from random import Random as _Random
35
Guido van Rossumd8faa362007-04-27 19:54:29 +000036try:
Guido van Rossum0e548712002-08-09 16:14:33 +000037 import fcntl as _fcntl
Tim Peters90ee7eb2004-07-18 23:58:17 +000038except ImportError:
Tim Peters291f14e2003-07-22 02:50:01 +000039 def _set_cloexec(fd):
40 pass
41else:
Guido van Rossum0e548712002-08-09 16:14:33 +000042 def _set_cloexec(fd):
Tim Peters90ee7eb2004-07-18 23:58:17 +000043 try:
44 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
Florent Xicluna68f71a32011-10-28 16:06:23 +020045 except OSError:
Tim Peters90ee7eb2004-07-18 23:58:17 +000046 pass
Alex Martellif09994e2003-11-09 16:44:09 +000047 else:
Guido van Rossum0e548712002-08-09 16:14:33 +000048 # flags read successfully, modify
49 flags |= _fcntl.FD_CLOEXEC
50 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
Tim Peters291f14e2003-07-22 02:50:01 +000051
Guido van Rossum0e548712002-08-09 16:14:33 +000052
53try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000054 import _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000055except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000056 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000057_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000058
59_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000060if hasattr(_os, 'O_NOINHERIT'):
61 _text_openflags |= _os.O_NOINHERIT
62if hasattr(_os, 'O_NOFOLLOW'):
63 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000064
65_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000066if hasattr(_os, 'O_BINARY'):
67 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000068
69if hasattr(_os, 'TMP_MAX'):
70 TMP_MAX = _os.TMP_MAX
71else:
72 TMP_MAX = 10000
73
R David Murray3a420c72011-06-22 21:01:13 -040074# Although it does not have an underscore for historical reasons, this
75# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000076template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000077
Guido van Rossum0e548712002-08-09 16:14:33 +000078# Internal routines.
79
80_once_lock = _allocate_lock()
81
Guido van Rossumb256159392003-11-10 02:16:36 +000082if hasattr(_os, "lstat"):
83 _stat = _os.lstat
84elif hasattr(_os, "stat"):
85 _stat = _os.stat
86else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020087 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000088 # file doesn't exist.
89 def _stat(fn):
Florent Xicluna46f5d142011-10-28 21:58:56 +020090 f = open(fn)
Guido van Rossumb256159392003-11-10 02:16:36 +000091 f.close()
92
93def _exists(fn):
94 try:
95 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020096 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000097 return False
98 else:
99 return True
100
Guido van Rossum0e548712002-08-09 16:14:33 +0000101class _RandomNameSequence:
102 """An instance of _RandomNameSequence generates an endless
103 sequence of unpredictable strings which can safely be incorporated
104 into file names. Each string is six characters long. Multiple
105 threads can safely use the same instance at the same time.
106
107 _RandomNameSequence is an iterator."""
108
Raymond Hettinger572895b2010-11-09 03:43:58 +0000109 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +0000110
Antoine Pitrou4558bad2011-11-25 21:28:15 +0100111 @property
112 def rng(self):
113 cur_pid = _os.getpid()
114 if cur_pid != getattr(self, '_rng_pid', None):
115 self._rng = _Random()
116 self._rng_pid = cur_pid
117 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000118
Guido van Rossum0e548712002-08-09 16:14:33 +0000119 def __iter__(self):
120 return self
121
Georg Brandla18af4e2007-04-21 15:47:16 +0000122 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000123 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000124 choose = self.rng.choice
Raymond Hettinger572895b2010-11-09 03:43:58 +0000125 letters = [choose(c) for dummy in "123456"]
126 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000127
128def _candidate_tempdir_list():
129 """Generate a list of candidate temporary directories which
130 _get_default_tempdir will try."""
131
132 dirlist = []
133
134 # First, try the environment.
135 for envname in 'TMPDIR', 'TEMP', 'TMP':
136 dirname = _os.getenv(envname)
137 if dirname: dirlist.append(dirname)
138
139 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000140 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000141 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
142 else:
143 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
144
145 # As a last resort, the current directory.
146 try:
147 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200148 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000149 dirlist.append(_os.curdir)
150
151 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000152
Guido van Rossum0e548712002-08-09 16:14:33 +0000153def _get_default_tempdir():
154 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000155 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000156
157 We determine whether or not a candidate temp dir is usable by
158 trying to create and write to a file in that directory. If this
159 is successful, the test file is deleted. To prevent denial of
160 service, the name of the test file must be randomized."""
161
162 namer = _RandomNameSequence()
163 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000164
165 for dir in dirlist:
166 if dir != _os.curdir:
167 dir = _os.path.normcase(_os.path.abspath(dir))
168 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000169 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000170 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000171 filename = _os.path.join(dir, name)
172 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000173 fd = _os.open(filename, _bin_openflags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000174 fp = _io.open(fd, 'wb')
175 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000176 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000177 _os.unlink(filename)
178 del fp, fd
179 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200180 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000181 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200182 except OSError:
183 break # no point trying more names in this directory
184 raise FileNotFoundError("No usable temporary directory found in %s" % dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000185
Guido van Rossume888cdc2002-08-17 14:50:24 +0000186_name_sequence = None
187
Guido van Rossum0e548712002-08-09 16:14:33 +0000188def _get_candidate_names():
189 """Common setup sequence for all user-callable interfaces."""
190
Guido van Rossume888cdc2002-08-17 14:50:24 +0000191 global _name_sequence
192 if _name_sequence is None:
193 _once_lock.acquire()
194 try:
195 if _name_sequence is None:
196 _name_sequence = _RandomNameSequence()
197 finally:
198 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000199 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000200
201
Guido van Rossum0e548712002-08-09 16:14:33 +0000202def _mkstemp_inner(dir, pre, suf, flags):
203 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000204
Guido van Rossum0e548712002-08-09 16:14:33 +0000205 names = _get_candidate_names()
206
Guido van Rossum805365e2007-05-07 22:24:25 +0000207 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000208 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000209 file = _os.path.join(dir, pre + name + suf)
210 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000211 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000212 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000213 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200214 except FileExistsError:
215 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000216
Florent Xicluna68f71a32011-10-28 16:06:23 +0200217 raise FileExistsError("No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000218
Guido van Rossum0e548712002-08-09 16:14:33 +0000219
220# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000221
Guido van Rossum41f95031992-03-31 19:02:01 +0000222def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000223 """Accessor for tempdir.template."""
224 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000225
Guido van Rossume888cdc2002-08-17 14:50:24 +0000226tempdir = None
227
Guido van Rossum0e548712002-08-09 16:14:33 +0000228def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000229 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000230 global tempdir
231 if tempdir is None:
232 _once_lock.acquire()
233 try:
234 if tempdir is None:
235 tempdir = _get_default_tempdir()
236 finally:
237 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000238 return tempdir
239
Guido van Rossume888cdc2002-08-17 14:50:24 +0000240def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000241 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000242 file. The return value is a pair (fd, name) where fd is the
243 file descriptor returned by os.open, and name is the filename.
244
245 If 'suffix' is specified, the file name will end with that suffix,
246 otherwise there will be no suffix.
247
248 If 'prefix' is specified, the file name will begin with that prefix,
249 otherwise a default prefix is used.
250
251 If 'dir' is specified, the file will be created in that directory,
252 otherwise a default directory is used.
253
Tim Peters04490bf2002-08-14 15:41:26 +0000254 If 'text' is specified and true, the file is opened in text
255 mode. Else (the default) the file is opened in binary mode. On
256 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000257
258 The file is readable and writable only by the creating user ID.
259 If the operating system uses permission bits to indicate whether a
260 file is executable, the file is executable by no one. The file
261 descriptor is not inherited by children of this process.
262
263 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000264 """
265
Guido van Rossume888cdc2002-08-17 14:50:24 +0000266 if dir is None:
267 dir = gettempdir()
268
Tim Peters04490bf2002-08-14 15:41:26 +0000269 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000270 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000271 else:
272 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000273
274 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000275
Guido van Rossumeee94981991-11-12 15:38:08 +0000276
Guido van Rossume888cdc2002-08-17 14:50:24 +0000277def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000278 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000279 directory. The return value is the pathname of the directory.
280
Tim Peters04490bf2002-08-14 15:41:26 +0000281 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000282 not accepted.
283
284 The directory is readable, writable, and searchable only by the
285 creating user.
286
287 Caller is responsible for deleting the directory when done with it.
288 """
289
Guido van Rossume888cdc2002-08-17 14:50:24 +0000290 if dir is None:
291 dir = gettempdir()
292
Guido van Rossum0e548712002-08-09 16:14:33 +0000293 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000294
Guido van Rossum805365e2007-05-07 22:24:25 +0000295 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000296 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000297 file = _os.path.join(dir, prefix + name + suffix)
298 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000299 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000300 return file
Florent Xicluna68f71a32011-10-28 16:06:23 +0200301 except FileExistsError:
302 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000303
Florent Xicluna68f71a32011-10-28 16:06:23 +0200304 raise FileExistsError("No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000305
Guido van Rossume888cdc2002-08-17 14:50:24 +0000306def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000307 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000308 file is not created.
309
Tim Peters04490bf2002-08-14 15:41:26 +0000310 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000311 not accepted.
312
313 This function is unsafe and should not be used. The file name
314 refers to a file that did not exist at some point, but by the time
315 you get around to creating it, someone else may have beaten you to
316 the punch.
317 """
318
Guido van Rossum44f602d2002-11-22 15:56:29 +0000319## from warnings import warn as _warn
320## _warn("mktemp is a potential security risk to your program",
321## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000322
Guido van Rossume888cdc2002-08-17 14:50:24 +0000323 if dir is None:
324 dir = gettempdir()
325
Guido van Rossum0e548712002-08-09 16:14:33 +0000326 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000327 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000328 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000329 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000330 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000331 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000332
Florent Xicluna68f71a32011-10-28 16:06:23 +0200333 raise FileExistsError("No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000334
Christian Heimes3ecfea712008-02-09 20:51:34 +0000335
Guido van Rossum0e548712002-08-09 16:14:33 +0000336class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000337 """Temporary file wrapper
338
Guido van Rossum0e548712002-08-09 16:14:33 +0000339 This class provides a wrapper around files opened for
340 temporary use. In particular, it seeks to automatically
341 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000342 """
Tim Petersa255a722001-12-18 22:32:40 +0000343
Guido van Rossumd8faa362007-04-27 19:54:29 +0000344 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000345 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000346 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000347 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000348 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000349
Guido van Rossumca549821997-08-12 18:00:12 +0000350 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000351 # Attribute lookups are delegated to the underlying file
352 # and cached for non-numeric results
353 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000354 file = self.__dict__['file']
355 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000356 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000357 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000358 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000359
Christian Heimes3ecfea712008-02-09 20:51:34 +0000360 # The underlying __enter__ method returns the wrong object
361 # (self.file) so override it to return the wrapper
362 def __enter__(self):
363 self.file.__enter__()
364 return self
365
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000366 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000367 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000368 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000369
Guido van Rossum0e548712002-08-09 16:14:33 +0000370 # NT provides delete-on-close as a primitive, so we don't need
371 # the wrapper to do anything special. We still use it so that
372 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
373 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000374 # Cache the unlinker so we don't get spurious errors at
375 # shutdown when the module-level "os" is None'd out. Note
376 # that this must be referenced as self.unlink, because the
377 # name TemporaryFileWrapper may also get None'd out before
378 # __del__ is called.
379 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000380
Guido van Rossum0e548712002-08-09 16:14:33 +0000381 def close(self):
382 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000383 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000384 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000385 if self.delete:
386 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000387
Guido van Rossum0e548712002-08-09 16:14:33 +0000388 def __del__(self):
389 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000390
Christian Heimes3ecfea712008-02-09 20:51:34 +0000391 # Need to trap __exit__ as well to ensure the file gets
392 # deleted when used in a with statement
393 def __exit__(self, exc, value, tb):
394 result = self.file.__exit__(exc, value, tb)
395 self.close()
396 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000397 else:
398 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000399 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000400
401
Guido van Rossumf0c74162007-08-28 03:29:45 +0000402def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
403 newline=None, suffix="", prefix=template,
404 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000405 """Create and return a temporary file.
406 Arguments:
407 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000408 'mode' -- the mode argument to io.open (default "w+b").
409 'buffering' -- the buffer size argument to io.open (default -1).
410 'encoding' -- the encoding argument to io.open (default None)
411 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000412 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000413 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000414
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000415 Returns an object with a file-like interface; the name of the file
416 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000417 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000418 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000419
Guido van Rossume888cdc2002-08-17 14:50:24 +0000420 if dir is None:
421 dir = gettempdir()
422
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000423 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000424
Guido van Rossum0e548712002-08-09 16:14:33 +0000425 # Setting O_TEMPORARY in the flags causes the OS to delete
426 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000427 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000428 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000429
Guido van Rossum0e548712002-08-09 16:14:33 +0000430 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000431 file = _io.open(fd, mode, buffering=buffering,
432 newline=newline, encoding=encoding)
433
Guido van Rossumd8faa362007-04-27 19:54:29 +0000434 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000435
Jason Tishler80c02af2002-08-14 15:10:09 +0000436if _os.name != 'posix' or _os.sys.platform == 'cygwin':
437 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
438 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000439 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000440
441else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000442 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
443 newline=None, suffix="", prefix=template,
444 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000445 """Create and return a temporary file.
446 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000447 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000448 'mode' -- the mode argument to io.open (default "w+b").
449 'buffering' -- the buffer size argument to io.open (default -1).
450 'encoding' -- the encoding argument to io.open (default None)
451 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000452 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000453
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000454 Returns an object with a file-like interface. The file has no
455 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 """
457
Guido van Rossume888cdc2002-08-17 14:50:24 +0000458 if dir is None:
459 dir = gettempdir()
460
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000461 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000462
463 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
464 try:
465 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000466 return _io.open(fd, mode, buffering=buffering,
467 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000468 except:
469 _os.close(fd)
470 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000471
472class SpooledTemporaryFile:
473 """Temporary file wrapper, specialized to switch from
474 StringIO to a real file when it exceeds a certain size or
475 when a fileno is needed.
476 """
477 _rolled = False
478
Guido van Rossumf0c74162007-08-28 03:29:45 +0000479 def __init__(self, max_size=0, mode='w+b', buffering=-1,
480 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000481 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000482 if 'b' in mode:
483 self._file = _io.BytesIO()
484 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000485 # Setting newline="\n" avoids newline translation;
486 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000487 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000488 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000489 self._max_size = max_size
490 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000491 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
492 'suffix': suffix, 'prefix': prefix,
493 'encoding': encoding, 'newline': newline,
494 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000495
496 def _check(self, file):
497 if self._rolled: return
498 max_size = self._max_size
499 if max_size and file.tell() > max_size:
500 self.rollover()
501
502 def rollover(self):
503 if self._rolled: return
504 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000505 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000506 del self._TemporaryFileArgs
507
508 newfile.write(file.getvalue())
509 newfile.seek(file.tell(), 0)
510
511 self._rolled = True
512
Christian Heimes3ecfea712008-02-09 20:51:34 +0000513 # The method caching trick from NamedTemporaryFile
514 # won't work here, because _file may change from a
515 # _StringIO instance to a real file. So we list
516 # all the methods directly.
517
518 # Context management protocol
519 def __enter__(self):
520 if self._file.closed:
521 raise ValueError("Cannot enter context with closed file")
522 return self
523
524 def __exit__(self, exc, value, tb):
525 self._file.close()
526
Guido van Rossumd8faa362007-04-27 19:54:29 +0000527 # file protocol
528 def __iter__(self):
529 return self._file.__iter__()
530
531 def close(self):
532 self._file.close()
533
534 @property
535 def closed(self):
536 return self._file.closed
537
538 @property
539 def encoding(self):
540 return self._file.encoding
541
542 def fileno(self):
543 self.rollover()
544 return self._file.fileno()
545
546 def flush(self):
547 self._file.flush()
548
549 def isatty(self):
550 return self._file.isatty()
551
552 @property
553 def mode(self):
554 return self._file.mode
555
556 @property
557 def name(self):
558 return self._file.name
559
560 @property
561 def newlines(self):
562 return self._file.newlines
563
564 def next(self):
565 return self._file.next
566
567 def read(self, *args):
568 return self._file.read(*args)
569
570 def readline(self, *args):
571 return self._file.readline(*args)
572
573 def readlines(self, *args):
574 return self._file.readlines(*args)
575
576 def seek(self, *args):
577 self._file.seek(*args)
578
579 @property
580 def softspace(self):
581 return self._file.softspace
582
583 def tell(self):
584 return self._file.tell()
585
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100586 def truncate(self, size=None):
587 if size is None:
588 self._file.truncate()
589 else:
590 if size > self._max_size:
591 self.rollover()
592 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000593
594 def write(self, s):
595 file = self._file
596 rv = file.write(s)
597 self._check(file)
598 return rv
599
600 def writelines(self, iterable):
601 file = self._file
602 rv = file.writelines(iterable)
603 self._check(file)
604 return rv
605
606 def xreadlines(self, *args):
607 return self._file.xreadlines(*args)
Nick Coghlan543af752010-10-24 11:23:25 +0000608
609
610class TemporaryDirectory(object):
611 """Create and return a temporary directory. This has the same
612 behavior as mkdtemp but can be used as a context manager. For
613 example:
614
615 with TemporaryDirectory() as tmpdir:
616 ...
617
618 Upon exiting the context, the directory and everthing contained
619 in it are removed.
620 """
621
622 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000623 self._closed = False
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000624 self.name = None # Handle mkdtemp throwing an exception
625 self.name = mkdtemp(suffix, prefix, dir)
626
627 def __repr__(self):
628 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000629
630 def __enter__(self):
631 return self.name
632
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000633 def cleanup(self, _warn=False):
634 if self.name and not self._closed:
635 try:
636 self._rmtree(self.name)
637 except (TypeError, AttributeError) as ex:
638 # Issue #10188: Emit a warning on stderr
639 # if the directory could not be cleaned
640 # up due to missing globals
641 if "None" not in str(ex):
642 raise
643 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
644 file=_sys.stderr)
645 return
Nick Coghlan543af752010-10-24 11:23:25 +0000646 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000647 if _warn:
648 self._warn("Implicitly cleaning up {!r}".format(self),
649 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000650
651 def __exit__(self, exc, value, tb):
652 self.cleanup()
653
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000654 def __del__(self):
655 # Issue a ResourceWarning if implicit cleanup needed
656 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000657
658 # XXX (ncoghlan): The following code attempts to make
659 # this class tolerant of the module nulling out process
660 # that happens during CPython interpreter shutdown
661 # Alas, it doesn't actually manage it. See issue #10188
662 _listdir = staticmethod(_os.listdir)
663 _path_join = staticmethod(_os.path.join)
664 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200665 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000666 _remove = staticmethod(_os.remove)
667 _rmdir = staticmethod(_os.rmdir)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200668 _os_error = OSError
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000669 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000670
671 def _rmtree(self, path):
672 # Essentially a stripped down version of shutil.rmtree. We can't
673 # use globals because they may be None'ed out at shutdown.
674 for name in self._listdir(path):
675 fullname = self._path_join(path, name)
676 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200677 isdir = self._isdir(fullname) and not self._islink(fullname)
Nick Coghlan543af752010-10-24 11:23:25 +0000678 except self._os_error:
679 isdir = False
680 if isdir:
681 self._rmtree(fullname)
682 else:
683 try:
684 self._remove(fullname)
685 except self._os_error:
686 pass
687 try:
688 self._rmdir(path)
689 except self._os_error:
690 pass