blob: 10b6a1b334edb3ac723aca34b56b356589bb0804 [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
Brett Cannoncd171c82013-07-04 17:43:24 -040039except 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
Brett Cannoncd171c82013-07-04 17:43:24 -040056except 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)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200177 try:
178 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200179 with _io.open(fd, 'wb', closefd=False) as fp:
180 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200181 finally:
182 _os.close(fd)
183 finally:
184 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000185 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200186 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000187 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200188 except OSError:
189 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200190 raise FileNotFoundError(_errno.ENOENT,
191 "No usable temporary directory found in %s" %
192 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000193
Guido van Rossume888cdc2002-08-17 14:50:24 +0000194_name_sequence = None
195
Guido van Rossum0e548712002-08-09 16:14:33 +0000196def _get_candidate_names():
197 """Common setup sequence for all user-callable interfaces."""
198
Guido van Rossume888cdc2002-08-17 14:50:24 +0000199 global _name_sequence
200 if _name_sequence is None:
201 _once_lock.acquire()
202 try:
203 if _name_sequence is None:
204 _name_sequence = _RandomNameSequence()
205 finally:
206 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000207 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000208
209
Guido van Rossum0e548712002-08-09 16:14:33 +0000210def _mkstemp_inner(dir, pre, suf, flags):
211 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000212
Guido van Rossum0e548712002-08-09 16:14:33 +0000213 names = _get_candidate_names()
214
Guido van Rossum805365e2007-05-07 22:24:25 +0000215 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000216 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000217 file = _os.path.join(dir, pre + name + suf)
218 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000219 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000220 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000221 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200222 except FileExistsError:
223 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000224
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200225 raise FileExistsError(_errno.EEXIST,
226 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000227
Guido van Rossum0e548712002-08-09 16:14:33 +0000228
229# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000230
Guido van Rossum41f95031992-03-31 19:02:01 +0000231def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000232 """Accessor for tempdir.template."""
233 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000234
Guido van Rossume888cdc2002-08-17 14:50:24 +0000235tempdir = None
236
Guido van Rossum0e548712002-08-09 16:14:33 +0000237def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000238 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000239 global tempdir
240 if tempdir is None:
241 _once_lock.acquire()
242 try:
243 if tempdir is None:
244 tempdir = _get_default_tempdir()
245 finally:
246 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000247 return tempdir
248
Guido van Rossume888cdc2002-08-17 14:50:24 +0000249def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000250 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000251 file. The return value is a pair (fd, name) where fd is the
252 file descriptor returned by os.open, and name is the filename.
253
254 If 'suffix' is specified, the file name will end with that suffix,
255 otherwise there will be no suffix.
256
257 If 'prefix' is specified, the file name will begin with that prefix,
258 otherwise a default prefix is used.
259
260 If 'dir' is specified, the file will be created in that directory,
261 otherwise a default directory is used.
262
Tim Peters04490bf2002-08-14 15:41:26 +0000263 If 'text' is specified and true, the file is opened in text
264 mode. Else (the default) the file is opened in binary mode. On
265 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000266
267 The file is readable and writable only by the creating user ID.
268 If the operating system uses permission bits to indicate whether a
269 file is executable, the file is executable by no one. The file
270 descriptor is not inherited by children of this process.
271
272 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000273 """
274
Guido van Rossume888cdc2002-08-17 14:50:24 +0000275 if dir is None:
276 dir = gettempdir()
277
Tim Peters04490bf2002-08-14 15:41:26 +0000278 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000279 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000280 else:
281 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000282
283 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000284
Guido van Rossumeee94981991-11-12 15:38:08 +0000285
Guido van Rossume888cdc2002-08-17 14:50:24 +0000286def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000287 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000288 directory. The return value is the pathname of the directory.
289
Tim Peters04490bf2002-08-14 15:41:26 +0000290 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000291 not accepted.
292
293 The directory is readable, writable, and searchable only by the
294 creating user.
295
296 Caller is responsible for deleting the directory when done with it.
297 """
298
Guido van Rossume888cdc2002-08-17 14:50:24 +0000299 if dir is None:
300 dir = gettempdir()
301
Guido van Rossum0e548712002-08-09 16:14:33 +0000302 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000303
Guido van Rossum805365e2007-05-07 22:24:25 +0000304 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000305 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000306 file = _os.path.join(dir, prefix + name + suffix)
307 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000308 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000309 return file
Florent Xicluna68f71a32011-10-28 16:06:23 +0200310 except FileExistsError:
311 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000312
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200313 raise FileExistsError(_errno.EEXIST,
314 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000315
Guido van Rossume888cdc2002-08-17 14:50:24 +0000316def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000317 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000318 file is not created.
319
Tim Peters04490bf2002-08-14 15:41:26 +0000320 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000321 not accepted.
322
323 This function is unsafe and should not be used. The file name
324 refers to a file that did not exist at some point, but by the time
325 you get around to creating it, someone else may have beaten you to
326 the punch.
327 """
328
Guido van Rossum44f602d2002-11-22 15:56:29 +0000329## from warnings import warn as _warn
330## _warn("mktemp is a potential security risk to your program",
331## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000332
Guido van Rossume888cdc2002-08-17 14:50:24 +0000333 if dir is None:
334 dir = gettempdir()
335
Guido van Rossum0e548712002-08-09 16:14:33 +0000336 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000337 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000338 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000339 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000340 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000341 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000342
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200343 raise FileExistsError(_errno.EEXIST,
344 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000345
Christian Heimes3ecfea712008-02-09 20:51:34 +0000346
Guido van Rossum0e548712002-08-09 16:14:33 +0000347class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000348 """Temporary file wrapper
349
Guido van Rossum0e548712002-08-09 16:14:33 +0000350 This class provides a wrapper around files opened for
351 temporary use. In particular, it seeks to automatically
352 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000353 """
Tim Petersa255a722001-12-18 22:32:40 +0000354
Guido van Rossumd8faa362007-04-27 19:54:29 +0000355 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000356 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000357 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000358 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000359 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000360
Guido van Rossumca549821997-08-12 18:00:12 +0000361 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000362 # Attribute lookups are delegated to the underlying file
363 # and cached for non-numeric results
364 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000365 file = self.__dict__['file']
366 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000367 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000368 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000369 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000370
Christian Heimes3ecfea712008-02-09 20:51:34 +0000371 # The underlying __enter__ method returns the wrong object
372 # (self.file) so override it to return the wrapper
373 def __enter__(self):
374 self.file.__enter__()
375 return self
376
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000377 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000378 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000379 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000380
Guido van Rossum0e548712002-08-09 16:14:33 +0000381 # NT provides delete-on-close as a primitive, so we don't need
382 # the wrapper to do anything special. We still use it so that
383 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
384 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000385 # Cache the unlinker so we don't get spurious errors at
386 # shutdown when the module-level "os" is None'd out. Note
387 # that this must be referenced as self.unlink, because the
388 # name TemporaryFileWrapper may also get None'd out before
389 # __del__ is called.
390 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000391
Guido van Rossum0e548712002-08-09 16:14:33 +0000392 def close(self):
393 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000394 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000395 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000396 if self.delete:
397 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000398
Guido van Rossum0e548712002-08-09 16:14:33 +0000399 def __del__(self):
400 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000401
Christian Heimes3ecfea712008-02-09 20:51:34 +0000402 # Need to trap __exit__ as well to ensure the file gets
403 # deleted when used in a with statement
404 def __exit__(self, exc, value, tb):
405 result = self.file.__exit__(exc, value, tb)
406 self.close()
407 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000408 else:
409 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000410 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000411
412
Guido van Rossumf0c74162007-08-28 03:29:45 +0000413def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
414 newline=None, suffix="", prefix=template,
415 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000416 """Create and return a temporary file.
417 Arguments:
418 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000419 'mode' -- the mode argument to io.open (default "w+b").
420 'buffering' -- the buffer size argument to io.open (default -1).
421 'encoding' -- the encoding argument to io.open (default None)
422 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000423 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000424 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000425
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000426 Returns an object with a file-like interface; the name of the file
427 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000428 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000429 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000430
Guido van Rossume888cdc2002-08-17 14:50:24 +0000431 if dir is None:
432 dir = gettempdir()
433
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000434 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000435
Guido van Rossum0e548712002-08-09 16:14:33 +0000436 # Setting O_TEMPORARY in the flags causes the OS to delete
437 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000438 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000439 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000440
Guido van Rossum0e548712002-08-09 16:14:33 +0000441 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000442 file = _io.open(fd, mode, buffering=buffering,
443 newline=newline, encoding=encoding)
444
Guido van Rossumd8faa362007-04-27 19:54:29 +0000445 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000446
Jason Tishler80c02af2002-08-14 15:10:09 +0000447if _os.name != 'posix' or _os.sys.platform == 'cygwin':
448 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
449 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000450 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000451
452else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000453 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
454 newline=None, suffix="", prefix=template,
455 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 """Create and return a temporary file.
457 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000458 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000459 'mode' -- the mode argument to io.open (default "w+b").
460 'buffering' -- the buffer size argument to io.open (default -1).
461 'encoding' -- the encoding argument to io.open (default None)
462 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000463 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000464
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000465 Returns an object with a file-like interface. The file has no
466 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000467 """
468
Guido van Rossume888cdc2002-08-17 14:50:24 +0000469 if dir is None:
470 dir = gettempdir()
471
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000472 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000473
474 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
475 try:
476 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000477 return _io.open(fd, mode, buffering=buffering,
478 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000479 except:
480 _os.close(fd)
481 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000482
483class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200484 """Temporary file wrapper, specialized to switch from BytesIO
485 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000486 when a fileno is needed.
487 """
488 _rolled = False
489
Guido van Rossumf0c74162007-08-28 03:29:45 +0000490 def __init__(self, max_size=0, mode='w+b', buffering=-1,
491 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000492 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000493 if 'b' in mode:
494 self._file = _io.BytesIO()
495 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000496 # Setting newline="\n" avoids newline translation;
497 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000498 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000499 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000500 self._max_size = max_size
501 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000502 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
503 'suffix': suffix, 'prefix': prefix,
504 'encoding': encoding, 'newline': newline,
505 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000506
507 def _check(self, file):
508 if self._rolled: return
509 max_size = self._max_size
510 if max_size and file.tell() > max_size:
511 self.rollover()
512
513 def rollover(self):
514 if self._rolled: return
515 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000516 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000517 del self._TemporaryFileArgs
518
519 newfile.write(file.getvalue())
520 newfile.seek(file.tell(), 0)
521
522 self._rolled = True
523
Christian Heimes3ecfea712008-02-09 20:51:34 +0000524 # The method caching trick from NamedTemporaryFile
525 # won't work here, because _file may change from a
526 # _StringIO instance to a real file. So we list
527 # all the methods directly.
528
529 # Context management protocol
530 def __enter__(self):
531 if self._file.closed:
532 raise ValueError("Cannot enter context with closed file")
533 return self
534
535 def __exit__(self, exc, value, tb):
536 self._file.close()
537
Guido van Rossumd8faa362007-04-27 19:54:29 +0000538 # file protocol
539 def __iter__(self):
540 return self._file.__iter__()
541
542 def close(self):
543 self._file.close()
544
545 @property
546 def closed(self):
547 return self._file.closed
548
549 @property
550 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200551 try:
552 return self._file.encoding
553 except AttributeError:
554 if 'b' in self._TemporaryFileArgs['mode']:
555 raise
556 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000557
558 def fileno(self):
559 self.rollover()
560 return self._file.fileno()
561
562 def flush(self):
563 self._file.flush()
564
565 def isatty(self):
566 return self._file.isatty()
567
568 @property
569 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200570 try:
571 return self._file.mode
572 except AttributeError:
573 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000574
575 @property
576 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200577 try:
578 return self._file.name
579 except AttributeError:
580 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000581
582 @property
583 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200584 try:
585 return self._file.newlines
586 except AttributeError:
587 if 'b' in self._TemporaryFileArgs['mode']:
588 raise
589 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000590
591 def read(self, *args):
592 return self._file.read(*args)
593
594 def readline(self, *args):
595 return self._file.readline(*args)
596
597 def readlines(self, *args):
598 return self._file.readlines(*args)
599
600 def seek(self, *args):
601 self._file.seek(*args)
602
603 @property
604 def softspace(self):
605 return self._file.softspace
606
607 def tell(self):
608 return self._file.tell()
609
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100610 def truncate(self, size=None):
611 if size is None:
612 self._file.truncate()
613 else:
614 if size > self._max_size:
615 self.rollover()
616 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000617
618 def write(self, s):
619 file = self._file
620 rv = file.write(s)
621 self._check(file)
622 return rv
623
624 def writelines(self, iterable):
625 file = self._file
626 rv = file.writelines(iterable)
627 self._check(file)
628 return rv
629
Nick Coghlan543af752010-10-24 11:23:25 +0000630
631class TemporaryDirectory(object):
632 """Create and return a temporary directory. This has the same
633 behavior as mkdtemp but can be used as a context manager. For
634 example:
635
636 with TemporaryDirectory() as tmpdir:
637 ...
638
639 Upon exiting the context, the directory and everthing contained
640 in it are removed.
641 """
642
643 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000644 self._closed = False
Andrew Svetlov737fb892012-12-18 21:14:22 +0200645 self.name = None # Handle mkdtemp raising an exception
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000646 self.name = mkdtemp(suffix, prefix, dir)
647
648 def __repr__(self):
649 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000650
651 def __enter__(self):
652 return self.name
653
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000654 def cleanup(self, _warn=False):
655 if self.name and not self._closed:
656 try:
657 self._rmtree(self.name)
658 except (TypeError, AttributeError) as ex:
659 # Issue #10188: Emit a warning on stderr
660 # if the directory could not be cleaned
661 # up due to missing globals
662 if "None" not in str(ex):
663 raise
664 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
665 file=_sys.stderr)
666 return
Nick Coghlan543af752010-10-24 11:23:25 +0000667 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000668 if _warn:
669 self._warn("Implicitly cleaning up {!r}".format(self),
670 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000671
672 def __exit__(self, exc, value, tb):
673 self.cleanup()
674
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000675 def __del__(self):
676 # Issue a ResourceWarning if implicit cleanup needed
677 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000678
679 # XXX (ncoghlan): The following code attempts to make
680 # this class tolerant of the module nulling out process
681 # that happens during CPython interpreter shutdown
682 # Alas, it doesn't actually manage it. See issue #10188
683 _listdir = staticmethod(_os.listdir)
684 _path_join = staticmethod(_os.path.join)
685 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200686 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000687 _remove = staticmethod(_os.remove)
688 _rmdir = staticmethod(_os.rmdir)
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000689 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000690
691 def _rmtree(self, path):
692 # Essentially a stripped down version of shutil.rmtree. We can't
693 # use globals because they may be None'ed out at shutdown.
694 for name in self._listdir(path):
695 fullname = self._path_join(path, name)
696 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200697 isdir = self._isdir(fullname) and not self._islink(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200698 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000699 isdir = False
700 if isdir:
701 self._rmtree(fullname)
702 else:
703 try:
704 self._remove(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200705 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000706 pass
707 try:
708 self._rmdir(path)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200709 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000710 pass