blob: 049cdaa2c237ee9cc60e38b31fe28d06ffa1716f [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.
13 template - the default prefix for all temporary names.
14 You may change this to control the default prefix.
15 tempdir - If this is set to a string before the first use of
16 any routine from this module, it will be considered as
17 another candidate location to store temporary files.
18"""
Skip Montanaro40fc1602001-03-01 04:27:19 +000019
Guido van Rossum0e548712002-08-09 16:14:33 +000020__all__ = [
21 "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
Guido van Rossumd8faa362007-04-27 19:54:29 +000022 "SpooledTemporaryFile",
Guido van Rossum0e548712002-08-09 16:14:33 +000023 "mkstemp", "mkdtemp", # low level safe interfaces
24 "mktemp", # deprecated unsafe interface
25 "TMP_MAX", "gettempprefix", # constants
26 "tempdir", "gettempdir"
27 ]
Guido van Rossum41f95031992-03-31 19:02:01 +000028
Tim Peters4fd5a062002-01-28 23:11:23 +000029
Guido van Rossum0e548712002-08-09 16:14:33 +000030# Imports.
Tim Peters4fd5a062002-01-28 23:11:23 +000031
Guido van Rossum9a634702007-07-09 10:24:45 +000032import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000033import os as _os
34import errno as _errno
35from 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)
46 except IOError:
47 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
Tim Petersbd7b4c72002-08-13 23:33:56 +000075template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000076
Guido van Rossum0e548712002-08-09 16:14:33 +000077# Internal routines.
78
79_once_lock = _allocate_lock()
80
Guido van Rossumb256159392003-11-10 02:16:36 +000081if hasattr(_os, "lstat"):
82 _stat = _os.lstat
83elif hasattr(_os, "stat"):
84 _stat = _os.stat
85else:
86 # Fallback. All we need is something that raises os.error if the
87 # file doesn't exist.
88 def _stat(fn):
89 try:
90 f = open(fn)
91 except IOError:
92 raise _os.error
93 f.close()
94
95def _exists(fn):
96 try:
97 _stat(fn)
98 except _os.error:
99 return False
100 else:
101 return True
102
Guido van Rossum0e548712002-08-09 16:14:33 +0000103class _RandomNameSequence:
104 """An instance of _RandomNameSequence generates an endless
105 sequence of unpredictable strings which can safely be incorporated
106 into file names. Each string is six characters long. Multiple
107 threads can safely use the same instance at the same time.
108
109 _RandomNameSequence is an iterator."""
110
Tim Peters97701b52002-11-21 15:59:59 +0000111 characters = ("abcdefghijklmnopqrstuvwxyz" +
112 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
Guido van Rossumd8faa362007-04-27 19:54:29 +0000113 "0123456789_")
Guido van Rossum0e548712002-08-09 16:14:33 +0000114
115 def __init__(self):
116 self.mutex = _allocate_lock()
117 self.rng = _Random()
118 self.normcase = _os.path.normcase
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 m = self.mutex
125 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000126 choose = self.rng.choice
Guido van Rossum0e548712002-08-09 16:14:33 +0000127
Tim Peters97701b52002-11-21 15:59:59 +0000128 m.acquire()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000129 try:
Tim Peters97701b52002-11-21 15:59:59 +0000130 letters = [choose(c) for dummy in "123456"]
Guido van Rossum0e548712002-08-09 16:14:33 +0000131 finally:
132 m.release()
133
Tim Peters97701b52002-11-21 15:59:59 +0000134 return self.normcase(''.join(letters))
Guido van Rossum0e548712002-08-09 16:14:33 +0000135
136def _candidate_tempdir_list():
137 """Generate a list of candidate temporary directories which
138 _get_default_tempdir will try."""
139
140 dirlist = []
141
142 # First, try the environment.
143 for envname in 'TMPDIR', 'TEMP', 'TMP':
144 dirname = _os.getenv(envname)
145 if dirname: dirlist.append(dirname)
146
147 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000148 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000149 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
150 else:
151 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
152
153 # As a last resort, the current directory.
154 try:
155 dirlist.append(_os.getcwd())
156 except (AttributeError, _os.error):
157 dirlist.append(_os.curdir)
158
159 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000160
Guido van Rossum0e548712002-08-09 16:14:33 +0000161def _get_default_tempdir():
162 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000163 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000164
165 We determine whether or not a candidate temp dir is usable by
166 trying to create and write to a file in that directory. If this
167 is successful, the test file is deleted. To prevent denial of
168 service, the name of the test file must be randomized."""
169
170 namer = _RandomNameSequence()
171 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000172
173 for dir in dirlist:
174 if dir != _os.curdir:
175 dir = _os.path.normcase(_os.path.abspath(dir))
176 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000177 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000178 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000179 filename = _os.path.join(dir, name)
180 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000181 fd = _os.open(filename, _bin_openflags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000182 fp = _io.open(fd, 'wb')
183 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000184 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000185 _os.unlink(filename)
186 del fp, fd
187 return dir
Guido van Rossumb940e112007-01-10 16:19:56 +0000188 except (OSError, IOError) as e:
Georg Brandl7816e512007-10-22 12:42:46 +0000189 if e.args[0] != _errno.EEXIST:
Guido van Rossum0e548712002-08-09 16:14:33 +0000190 break # no point trying more names in this directory
191 pass
Collin Winterce36ad82007-08-30 01:19:48 +0000192 raise IOError(_errno.ENOENT,
193 "No usable temporary directory found in %s" % dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000194
Guido van Rossume888cdc2002-08-17 14:50:24 +0000195_name_sequence = None
196
Guido van Rossum0e548712002-08-09 16:14:33 +0000197def _get_candidate_names():
198 """Common setup sequence for all user-callable interfaces."""
199
Guido van Rossume888cdc2002-08-17 14:50:24 +0000200 global _name_sequence
201 if _name_sequence is None:
202 _once_lock.acquire()
203 try:
204 if _name_sequence is None:
205 _name_sequence = _RandomNameSequence()
206 finally:
207 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000208 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000209
210
Guido van Rossum0e548712002-08-09 16:14:33 +0000211def _mkstemp_inner(dir, pre, suf, flags):
212 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000213
Guido van Rossum0e548712002-08-09 16:14:33 +0000214 names = _get_candidate_names()
215
Guido van Rossum805365e2007-05-07 22:24:25 +0000216 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000217 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000218 file = _os.path.join(dir, pre + name + suf)
219 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000220 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000221 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000222 return (fd, _os.path.abspath(file))
Guido van Rossumb940e112007-01-10 16:19:56 +0000223 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000224 if e.errno == _errno.EEXIST:
225 continue # try again
226 raise
227
Collin Winterce36ad82007-08-30 01:19:48 +0000228 raise IOError(_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000229
Guido van Rossum0e548712002-08-09 16:14:33 +0000230
231# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000232
Guido van Rossum41f95031992-03-31 19:02:01 +0000233def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000234 """Accessor for tempdir.template."""
235 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000236
Guido van Rossume888cdc2002-08-17 14:50:24 +0000237tempdir = None
238
Guido van Rossum0e548712002-08-09 16:14:33 +0000239def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000240 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000241 global tempdir
242 if tempdir is None:
243 _once_lock.acquire()
244 try:
245 if tempdir is None:
246 tempdir = _get_default_tempdir()
247 finally:
248 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000249 return tempdir
250
Guido van Rossume888cdc2002-08-17 14:50:24 +0000251def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000252 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000253 file. The return value is a pair (fd, name) where fd is the
254 file descriptor returned by os.open, and name is the filename.
255
256 If 'suffix' is specified, the file name will end with that suffix,
257 otherwise there will be no suffix.
258
259 If 'prefix' is specified, the file name will begin with that prefix,
260 otherwise a default prefix is used.
261
262 If 'dir' is specified, the file will be created in that directory,
263 otherwise a default directory is used.
264
Tim Peters04490bf2002-08-14 15:41:26 +0000265 If 'text' is specified and true, the file is opened in text
266 mode. Else (the default) the file is opened in binary mode. On
267 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000268
269 The file is readable and writable only by the creating user ID.
270 If the operating system uses permission bits to indicate whether a
271 file is executable, the file is executable by no one. The file
272 descriptor is not inherited by children of this process.
273
274 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000275 """
276
Guido van Rossume888cdc2002-08-17 14:50:24 +0000277 if dir is None:
278 dir = gettempdir()
279
Tim Peters04490bf2002-08-14 15:41:26 +0000280 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000281 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000282 else:
283 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000284
285 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000286
Guido van Rossumeee94981991-11-12 15:38:08 +0000287
Guido van Rossume888cdc2002-08-17 14:50:24 +0000288def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000289 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000290 directory. The return value is the pathname of the directory.
291
Tim Peters04490bf2002-08-14 15:41:26 +0000292 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000293 not accepted.
294
295 The directory is readable, writable, and searchable only by the
296 creating user.
297
298 Caller is responsible for deleting the directory when done with it.
299 """
300
Guido van Rossume888cdc2002-08-17 14:50:24 +0000301 if dir is None:
302 dir = gettempdir()
303
Guido van Rossum0e548712002-08-09 16:14:33 +0000304 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000305
Guido van Rossum805365e2007-05-07 22:24:25 +0000306 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000307 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000308 file = _os.path.join(dir, prefix + name + suffix)
309 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000310 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000311 return file
Guido van Rossumb940e112007-01-10 16:19:56 +0000312 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000313 if e.errno == _errno.EEXIST:
314 continue # try again
315 raise
316
Collin Winterce36ad82007-08-30 01:19:48 +0000317 raise IOError(_errno.EEXIST, "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000318
Guido van Rossume888cdc2002-08-17 14:50:24 +0000319def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000320 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000321 file is not created.
322
Tim Peters04490bf2002-08-14 15:41:26 +0000323 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000324 not accepted.
325
326 This function is unsafe and should not be used. The file name
327 refers to a file that did not exist at some point, but by the time
328 you get around to creating it, someone else may have beaten you to
329 the punch.
330 """
331
Guido van Rossum44f602d2002-11-22 15:56:29 +0000332## from warnings import warn as _warn
333## _warn("mktemp is a potential security risk to your program",
334## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000335
Guido van Rossume888cdc2002-08-17 14:50:24 +0000336 if dir is None:
337 dir = gettempdir()
338
Guido van Rossum0e548712002-08-09 16:14:33 +0000339 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000340 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000341 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000342 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000343 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000344 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000345
Collin Winterce36ad82007-08-30 01:19:48 +0000346 raise IOError(_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000347
Christian Heimes3ecfea712008-02-09 20:51:34 +0000348
Guido van Rossum0e548712002-08-09 16:14:33 +0000349class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000350 """Temporary file wrapper
351
Guido van Rossum0e548712002-08-09 16:14:33 +0000352 This class provides a wrapper around files opened for
353 temporary use. In particular, it seeks to automatically
354 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000355 """
Tim Petersa255a722001-12-18 22:32:40 +0000356
Guido van Rossumd8faa362007-04-27 19:54:29 +0000357 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000358 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000359 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000360 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000361 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000362
Guido van Rossumca549821997-08-12 18:00:12 +0000363 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000364 # Attribute lookups are delegated to the underlying file
365 # and cached for non-numeric results
366 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000367 file = self.__dict__['file']
368 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000369 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000370 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000371 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000372
Christian Heimes3ecfea712008-02-09 20:51:34 +0000373 # The underlying __enter__ method returns the wrong object
374 # (self.file) so override it to return the wrapper
375 def __enter__(self):
376 self.file.__enter__()
377 return self
378
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000379 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000380 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000381 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000382
Guido van Rossum0e548712002-08-09 16:14:33 +0000383 # NT provides delete-on-close as a primitive, so we don't need
384 # the wrapper to do anything special. We still use it so that
385 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
386 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000387 # Cache the unlinker so we don't get spurious errors at
388 # shutdown when the module-level "os" is None'd out. Note
389 # that this must be referenced as self.unlink, because the
390 # name TemporaryFileWrapper may also get None'd out before
391 # __del__ is called.
392 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000393
Guido van Rossum0e548712002-08-09 16:14:33 +0000394 def close(self):
395 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000396 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000397 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000398 if self.delete:
399 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000400
Guido van Rossum0e548712002-08-09 16:14:33 +0000401 def __del__(self):
402 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000403
Christian Heimes3ecfea712008-02-09 20:51:34 +0000404 # Need to trap __exit__ as well to ensure the file gets
405 # deleted when used in a with statement
406 def __exit__(self, exc, value, tb):
407 result = self.file.__exit__(exc, value, tb)
408 self.close()
409 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000410 else:
411 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000412 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000413
414
Guido van Rossumf0c74162007-08-28 03:29:45 +0000415def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
416 newline=None, suffix="", prefix=template,
417 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000418 """Create and return a temporary file.
419 Arguments:
420 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000421 'mode' -- the mode argument to io.open (default "w+b").
422 'buffering' -- the buffer size argument to io.open (default -1).
423 'encoding' -- the encoding argument to io.open (default None)
424 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000425 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000426 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000427
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000428 Returns an object with a file-like interface; the name of the file
429 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000430 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000431 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000432
Guido van Rossume888cdc2002-08-17 14:50:24 +0000433 if dir is None:
434 dir = gettempdir()
435
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000436 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000437
Guido van Rossum0e548712002-08-09 16:14:33 +0000438 # Setting O_TEMPORARY in the flags causes the OS to delete
439 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000440 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000441 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000442
Guido van Rossum0e548712002-08-09 16:14:33 +0000443 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000444 file = _io.open(fd, mode, buffering=buffering,
445 newline=newline, encoding=encoding)
446
Guido van Rossumd8faa362007-04-27 19:54:29 +0000447 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000448
Jason Tishler80c02af2002-08-14 15:10:09 +0000449if _os.name != 'posix' or _os.sys.platform == 'cygwin':
450 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
451 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000452 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000453
454else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000455 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
456 newline=None, suffix="", prefix=template,
457 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000458 """Create and return a temporary file.
459 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000460 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000461 'mode' -- the mode argument to io.open (default "w+b").
462 'buffering' -- the buffer size argument to io.open (default -1).
463 'encoding' -- the encoding argument to io.open (default None)
464 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000465 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000466
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000467 Returns an object with a file-like interface. The file has no
468 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000469 """
470
Guido van Rossume888cdc2002-08-17 14:50:24 +0000471 if dir is None:
472 dir = gettempdir()
473
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000474 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000475
476 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
477 try:
478 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000479 return _io.open(fd, mode, buffering=buffering,
480 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000481 except:
482 _os.close(fd)
483 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484
485class SpooledTemporaryFile:
486 """Temporary file wrapper, specialized to switch from
487 StringIO to a real file when it exceeds a certain size or
488 when a fileno is needed.
489 """
490 _rolled = False
491
Guido van Rossumf0c74162007-08-28 03:29:45 +0000492 def __init__(self, max_size=0, mode='w+b', buffering=-1,
493 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000494 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000495 if 'b' in mode:
496 self._file = _io.BytesIO()
497 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000498 # Setting newline="\n" avoids newline translation;
499 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000500 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000501 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000502 self._max_size = max_size
503 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000504 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
505 'suffix': suffix, 'prefix': prefix,
506 'encoding': encoding, 'newline': newline,
507 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000508
509 def _check(self, file):
510 if self._rolled: return
511 max_size = self._max_size
512 if max_size and file.tell() > max_size:
513 self.rollover()
514
515 def rollover(self):
516 if self._rolled: return
517 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000518 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000519 del self._TemporaryFileArgs
520
521 newfile.write(file.getvalue())
522 newfile.seek(file.tell(), 0)
523
524 self._rolled = True
525
Christian Heimes3ecfea712008-02-09 20:51:34 +0000526 # The method caching trick from NamedTemporaryFile
527 # won't work here, because _file may change from a
528 # _StringIO instance to a real file. So we list
529 # all the methods directly.
530
531 # Context management protocol
532 def __enter__(self):
533 if self._file.closed:
534 raise ValueError("Cannot enter context with closed file")
535 return self
536
537 def __exit__(self, exc, value, tb):
538 self._file.close()
539
Guido van Rossumd8faa362007-04-27 19:54:29 +0000540 # file protocol
541 def __iter__(self):
542 return self._file.__iter__()
543
544 def close(self):
545 self._file.close()
546
547 @property
548 def closed(self):
549 return self._file.closed
550
551 @property
552 def encoding(self):
553 return self._file.encoding
554
555 def fileno(self):
556 self.rollover()
557 return self._file.fileno()
558
559 def flush(self):
560 self._file.flush()
561
562 def isatty(self):
563 return self._file.isatty()
564
565 @property
566 def mode(self):
567 return self._file.mode
568
569 @property
570 def name(self):
571 return self._file.name
572
573 @property
574 def newlines(self):
575 return self._file.newlines
576
577 def next(self):
578 return self._file.next
579
580 def read(self, *args):
581 return self._file.read(*args)
582
583 def readline(self, *args):
584 return self._file.readline(*args)
585
586 def readlines(self, *args):
587 return self._file.readlines(*args)
588
589 def seek(self, *args):
590 self._file.seek(*args)
591
592 @property
593 def softspace(self):
594 return self._file.softspace
595
596 def tell(self):
597 return self._file.tell()
598
599 def truncate(self):
600 self._file.truncate()
601
602 def write(self, s):
603 file = self._file
604 rv = file.write(s)
605 self._check(file)
606 return rv
607
608 def writelines(self, iterable):
609 file = self._file
610 rv = file.writelines(iterable)
611 self._check(file)
612 return rv
613
614 def xreadlines(self, *args):
615 return self._file.xreadlines(*args)