blob: 93405a85ba10a36d423574b54b9417ea5324df23 [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()
172 flags = _text_openflags
173
174 for dir in dirlist:
175 if dir != _os.curdir:
176 dir = _os.path.normcase(_os.path.abspath(dir))
177 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000178 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000179 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000180 filename = _os.path.join(dir, name)
181 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000182 fd = _os.open(filename, flags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000183 fp = _io.open(fd, 'wb')
184 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000185 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000186 _os.unlink(filename)
187 del fp, fd
188 return dir
Guido van Rossumb940e112007-01-10 16:19:56 +0000189 except (OSError, IOError) as e:
Georg Brandl7816e512007-10-22 12:42:46 +0000190 if e.args[0] != _errno.EEXIST:
Guido van Rossum0e548712002-08-09 16:14:33 +0000191 break # no point trying more names in this directory
192 pass
Collin Winterce36ad82007-08-30 01:19:48 +0000193 raise IOError(_errno.ENOENT,
194 "No usable temporary directory found in %s" % dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000195
Guido van Rossume888cdc2002-08-17 14:50:24 +0000196_name_sequence = None
197
Guido van Rossum0e548712002-08-09 16:14:33 +0000198def _get_candidate_names():
199 """Common setup sequence for all user-callable interfaces."""
200
Guido van Rossume888cdc2002-08-17 14:50:24 +0000201 global _name_sequence
202 if _name_sequence is None:
203 _once_lock.acquire()
204 try:
205 if _name_sequence is None:
206 _name_sequence = _RandomNameSequence()
207 finally:
208 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000209 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000210
211
Guido van Rossum0e548712002-08-09 16:14:33 +0000212def _mkstemp_inner(dir, pre, suf, flags):
213 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000214
Guido van Rossum0e548712002-08-09 16:14:33 +0000215 names = _get_candidate_names()
216
Guido van Rossum805365e2007-05-07 22:24:25 +0000217 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000218 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000219 file = _os.path.join(dir, pre + name + suf)
220 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000221 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000222 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000223 return (fd, _os.path.abspath(file))
Guido van Rossumb940e112007-01-10 16:19:56 +0000224 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000225 if e.errno == _errno.EEXIST:
226 continue # try again
227 raise
228
Collin Winterce36ad82007-08-30 01:19:48 +0000229 raise IOError(_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000230
Guido van Rossum0e548712002-08-09 16:14:33 +0000231
232# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000233
Guido van Rossum41f95031992-03-31 19:02:01 +0000234def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000235 """Accessor for tempdir.template."""
236 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000237
Guido van Rossume888cdc2002-08-17 14:50:24 +0000238tempdir = None
239
Guido van Rossum0e548712002-08-09 16:14:33 +0000240def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000241 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000242 global tempdir
243 if tempdir is None:
244 _once_lock.acquire()
245 try:
246 if tempdir is None:
247 tempdir = _get_default_tempdir()
248 finally:
249 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000250 return tempdir
251
Guido van Rossume888cdc2002-08-17 14:50:24 +0000252def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000253 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000254 file. The return value is a pair (fd, name) where fd is the
255 file descriptor returned by os.open, and name is the filename.
256
257 If 'suffix' is specified, the file name will end with that suffix,
258 otherwise there will be no suffix.
259
260 If 'prefix' is specified, the file name will begin with that prefix,
261 otherwise a default prefix is used.
262
263 If 'dir' is specified, the file will be created in that directory,
264 otherwise a default directory is used.
265
Tim Peters04490bf2002-08-14 15:41:26 +0000266 If 'text' is specified and true, the file is opened in text
267 mode. Else (the default) the file is opened in binary mode. On
268 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000269
270 The file is readable and writable only by the creating user ID.
271 If the operating system uses permission bits to indicate whether a
272 file is executable, the file is executable by no one. The file
273 descriptor is not inherited by children of this process.
274
275 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000276 """
277
Guido van Rossume888cdc2002-08-17 14:50:24 +0000278 if dir is None:
279 dir = gettempdir()
280
Tim Peters04490bf2002-08-14 15:41:26 +0000281 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000282 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000283 else:
284 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000285
286 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000287
Guido van Rossumeee94981991-11-12 15:38:08 +0000288
Guido van Rossume888cdc2002-08-17 14:50:24 +0000289def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000290 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000291 directory. The return value is the pathname of the directory.
292
Tim Peters04490bf2002-08-14 15:41:26 +0000293 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000294 not accepted.
295
296 The directory is readable, writable, and searchable only by the
297 creating user.
298
299 Caller is responsible for deleting the directory when done with it.
300 """
301
Guido van Rossume888cdc2002-08-17 14:50:24 +0000302 if dir is None:
303 dir = gettempdir()
304
Guido van Rossum0e548712002-08-09 16:14:33 +0000305 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000306
Guido van Rossum805365e2007-05-07 22:24:25 +0000307 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000308 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000309 file = _os.path.join(dir, prefix + name + suffix)
310 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000311 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000312 return file
Guido van Rossumb940e112007-01-10 16:19:56 +0000313 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000314 if e.errno == _errno.EEXIST:
315 continue # try again
316 raise
317
Collin Winterce36ad82007-08-30 01:19:48 +0000318 raise IOError(_errno.EEXIST, "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000319
Guido van Rossume888cdc2002-08-17 14:50:24 +0000320def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000321 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000322 file is not created.
323
Tim Peters04490bf2002-08-14 15:41:26 +0000324 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000325 not accepted.
326
327 This function is unsafe and should not be used. The file name
328 refers to a file that did not exist at some point, but by the time
329 you get around to creating it, someone else may have beaten you to
330 the punch.
331 """
332
Guido van Rossum44f602d2002-11-22 15:56:29 +0000333## from warnings import warn as _warn
334## _warn("mktemp is a potential security risk to your program",
335## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000336
Guido van Rossume888cdc2002-08-17 14:50:24 +0000337 if dir is None:
338 dir = gettempdir()
339
Guido van Rossum0e548712002-08-09 16:14:33 +0000340 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000341 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000342 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000343 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000344 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000345 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000346
Collin Winterce36ad82007-08-30 01:19:48 +0000347 raise IOError(_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000348
Christian Heimes3ecfea712008-02-09 20:51:34 +0000349
Guido van Rossum0e548712002-08-09 16:14:33 +0000350class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000351 """Temporary file wrapper
352
Guido van Rossum0e548712002-08-09 16:14:33 +0000353 This class provides a wrapper around files opened for
354 temporary use. In particular, it seeks to automatically
355 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000356 """
Tim Petersa255a722001-12-18 22:32:40 +0000357
Guido van Rossumd8faa362007-04-27 19:54:29 +0000358 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000359 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000360 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000361 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000362 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000363
Guido van Rossumca549821997-08-12 18:00:12 +0000364 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000365 # Attribute lookups are delegated to the underlying file
366 # and cached for non-numeric results
367 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000368 file = self.__dict__['file']
369 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000370 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000371 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000372 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000373
Christian Heimes3ecfea712008-02-09 20:51:34 +0000374 # The underlying __enter__ method returns the wrong object
375 # (self.file) so override it to return the wrapper
376 def __enter__(self):
377 self.file.__enter__()
378 return self
379
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000380 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000381 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000382 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000383
Guido van Rossum0e548712002-08-09 16:14:33 +0000384 # NT provides delete-on-close as a primitive, so we don't need
385 # the wrapper to do anything special. We still use it so that
386 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
387 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000388 # Cache the unlinker so we don't get spurious errors at
389 # shutdown when the module-level "os" is None'd out. Note
390 # that this must be referenced as self.unlink, because the
391 # name TemporaryFileWrapper may also get None'd out before
392 # __del__ is called.
393 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000394
Guido van Rossum0e548712002-08-09 16:14:33 +0000395 def close(self):
396 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000397 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000398 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000399 if self.delete:
400 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000401
Guido van Rossum0e548712002-08-09 16:14:33 +0000402 def __del__(self):
403 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000404
Christian Heimes3ecfea712008-02-09 20:51:34 +0000405 # Need to trap __exit__ as well to ensure the file gets
406 # deleted when used in a with statement
407 def __exit__(self, exc, value, tb):
408 result = self.file.__exit__(exc, value, tb)
409 self.close()
410 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000411 else:
412 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000413 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000414
415
Guido van Rossumf0c74162007-08-28 03:29:45 +0000416def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
417 newline=None, suffix="", prefix=template,
418 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000419 """Create and return a temporary file.
420 Arguments:
421 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000422 'mode' -- the mode argument to io.open (default "w+b").
423 'buffering' -- the buffer size argument to io.open (default -1).
424 'encoding' -- the encoding argument to io.open (default None)
425 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000426 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000427 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000428
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000429 Returns an object with a file-like interface; the name of the file
430 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000431 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000432 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000433
Guido van Rossume888cdc2002-08-17 14:50:24 +0000434 if dir is None:
435 dir = gettempdir()
436
Tim Petersc21ea742002-08-13 23:36:01 +0000437 if 'b' in mode:
438 flags = _bin_openflags
439 else:
440 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000441
Guido van Rossum0e548712002-08-09 16:14:33 +0000442 # Setting O_TEMPORARY in the flags causes the OS to delete
443 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000444 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000445 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000446
Guido van Rossum0e548712002-08-09 16:14:33 +0000447 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000448 file = _io.open(fd, mode, buffering=buffering,
449 newline=newline, encoding=encoding)
450
Guido van Rossumd8faa362007-04-27 19:54:29 +0000451 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000452
Jason Tishler80c02af2002-08-14 15:10:09 +0000453if _os.name != 'posix' or _os.sys.platform == 'cygwin':
454 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
455 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000457
458else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000459 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
460 newline=None, suffix="", prefix=template,
461 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000462 """Create and return a temporary file.
463 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000464 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000465 'mode' -- the mode argument to io.open (default "w+b").
466 'buffering' -- the buffer size argument to io.open (default -1).
467 'encoding' -- the encoding argument to io.open (default None)
468 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000469 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000470
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000471 Returns an object with a file-like interface. The file has no
472 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000473 """
474
Guido van Rossume888cdc2002-08-17 14:50:24 +0000475 if dir is None:
476 dir = gettempdir()
477
Tim Petersc21ea742002-08-13 23:36:01 +0000478 if 'b' in mode:
479 flags = _bin_openflags
480 else:
481 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000482
483 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
484 try:
485 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000486 return _io.open(fd, mode, buffering=buffering,
487 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000488 except:
489 _os.close(fd)
490 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000491
492class SpooledTemporaryFile:
493 """Temporary file wrapper, specialized to switch from
494 StringIO to a real file when it exceeds a certain size or
495 when a fileno is needed.
496 """
497 _rolled = False
498
Guido van Rossumf0c74162007-08-28 03:29:45 +0000499 def __init__(self, max_size=0, mode='w+b', buffering=-1,
500 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000501 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000502 if 'b' in mode:
503 self._file = _io.BytesIO()
504 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000505 # Setting newline="\n" avoids newline translation;
506 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000507 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000508 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000509 self._max_size = max_size
510 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000511 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
512 'suffix': suffix, 'prefix': prefix,
513 'encoding': encoding, 'newline': newline,
514 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000515
516 def _check(self, file):
517 if self._rolled: return
518 max_size = self._max_size
519 if max_size and file.tell() > max_size:
520 self.rollover()
521
522 def rollover(self):
523 if self._rolled: return
524 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000525 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000526 del self._TemporaryFileArgs
527
528 newfile.write(file.getvalue())
529 newfile.seek(file.tell(), 0)
530
531 self._rolled = True
532
Christian Heimes3ecfea712008-02-09 20:51:34 +0000533 # The method caching trick from NamedTemporaryFile
534 # won't work here, because _file may change from a
535 # _StringIO instance to a real file. So we list
536 # all the methods directly.
537
538 # Context management protocol
539 def __enter__(self):
540 if self._file.closed:
541 raise ValueError("Cannot enter context with closed file")
542 return self
543
544 def __exit__(self, exc, value, tb):
545 self._file.close()
546
Guido van Rossumd8faa362007-04-27 19:54:29 +0000547 # file protocol
548 def __iter__(self):
549 return self._file.__iter__()
550
551 def close(self):
552 self._file.close()
553
554 @property
555 def closed(self):
556 return self._file.closed
557
558 @property
559 def encoding(self):
560 return self._file.encoding
561
562 def fileno(self):
563 self.rollover()
564 return self._file.fileno()
565
566 def flush(self):
567 self._file.flush()
568
569 def isatty(self):
570 return self._file.isatty()
571
572 @property
573 def mode(self):
574 return self._file.mode
575
576 @property
577 def name(self):
578 return self._file.name
579
580 @property
581 def newlines(self):
582 return self._file.newlines
583
584 def next(self):
585 return self._file.next
586
587 def read(self, *args):
588 return self._file.read(*args)
589
590 def readline(self, *args):
591 return self._file.readline(*args)
592
593 def readlines(self, *args):
594 return self._file.readlines(*args)
595
596 def seek(self, *args):
597 self._file.seek(*args)
598
599 @property
600 def softspace(self):
601 return self._file.softspace
602
603 def tell(self):
604 return self._file.tell()
605
606 def truncate(self):
607 self._file.truncate()
608
609 def write(self, s):
610 file = self._file
611 rv = file.write(s)
612 self._check(file)
613 return rv
614
615 def writelines(self, iterable):
616 file = self._file
617 rv = file.writelines(iterable)
618 self._check(file)
619 return rv
620
621 def xreadlines(self, *args):
622 return self._file.xreadlines(*args)