blob: 4f27f614a19312a607a30dd91891ac2198b89178 [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
37if _os.name == 'mac':
Jack Jansenbb829b72003-03-21 12:55:38 +000038 import Carbon.Folder as _Folder
39 import Carbon.Folders as _Folders
Guido van Rossum0e548712002-08-09 16:14:33 +000040
Guido van Rossumd8faa362007-04-27 19:54:29 +000041try:
Guido van Rossum0e548712002-08-09 16:14:33 +000042 import fcntl as _fcntl
Tim Peters90ee7eb2004-07-18 23:58:17 +000043except ImportError:
Tim Peters291f14e2003-07-22 02:50:01 +000044 def _set_cloexec(fd):
45 pass
46else:
Guido van Rossum0e548712002-08-09 16:14:33 +000047 def _set_cloexec(fd):
Tim Peters90ee7eb2004-07-18 23:58:17 +000048 try:
49 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
50 except IOError:
51 pass
Alex Martellif09994e2003-11-09 16:44:09 +000052 else:
Guido van Rossum0e548712002-08-09 16:14:33 +000053 # flags read successfully, modify
54 flags |= _fcntl.FD_CLOEXEC
55 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
Tim Peters291f14e2003-07-22 02:50:01 +000056
Guido van Rossum0e548712002-08-09 16:14:33 +000057
58try:
59 import thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000060except ImportError:
61 import dummy_thread as _thread
62_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000063
64_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000065if hasattr(_os, 'O_NOINHERIT'):
66 _text_openflags |= _os.O_NOINHERIT
67if hasattr(_os, 'O_NOFOLLOW'):
68 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000069
70_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000071if hasattr(_os, 'O_BINARY'):
72 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000073
74if hasattr(_os, 'TMP_MAX'):
75 TMP_MAX = _os.TMP_MAX
76else:
77 TMP_MAX = 10000
78
Tim Petersbd7b4c72002-08-13 23:33:56 +000079template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000080
81tempdir = None
82
83# Internal routines.
84
85_once_lock = _allocate_lock()
86
Guido van Rossumb256159392003-11-10 02:16:36 +000087if hasattr(_os, "lstat"):
88 _stat = _os.lstat
89elif hasattr(_os, "stat"):
90 _stat = _os.stat
91else:
92 # Fallback. All we need is something that raises os.error if the
93 # file doesn't exist.
94 def _stat(fn):
95 try:
96 f = open(fn)
97 except IOError:
98 raise _os.error
99 f.close()
100
101def _exists(fn):
102 try:
103 _stat(fn)
104 except _os.error:
105 return False
106 else:
107 return True
108
Guido van Rossum0e548712002-08-09 16:14:33 +0000109class _RandomNameSequence:
110 """An instance of _RandomNameSequence generates an endless
111 sequence of unpredictable strings which can safely be incorporated
112 into file names. Each string is six characters long. Multiple
113 threads can safely use the same instance at the same time.
114
115 _RandomNameSequence is an iterator."""
116
Tim Peters97701b52002-11-21 15:59:59 +0000117 characters = ("abcdefghijklmnopqrstuvwxyz" +
118 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
Guido van Rossumd8faa362007-04-27 19:54:29 +0000119 "0123456789_")
Guido van Rossum0e548712002-08-09 16:14:33 +0000120
121 def __init__(self):
122 self.mutex = _allocate_lock()
123 self.rng = _Random()
124 self.normcase = _os.path.normcase
Tim Peters97701b52002-11-21 15:59:59 +0000125
Guido van Rossum0e548712002-08-09 16:14:33 +0000126 def __iter__(self):
127 return self
128
Georg Brandla18af4e2007-04-21 15:47:16 +0000129 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000130 m = self.mutex
131 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000132 choose = self.rng.choice
Guido van Rossum0e548712002-08-09 16:14:33 +0000133
Tim Peters97701b52002-11-21 15:59:59 +0000134 m.acquire()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000135 try:
Tim Peters97701b52002-11-21 15:59:59 +0000136 letters = [choose(c) for dummy in "123456"]
Guido van Rossum0e548712002-08-09 16:14:33 +0000137 finally:
138 m.release()
139
Tim Peters97701b52002-11-21 15:59:59 +0000140 return self.normcase(''.join(letters))
Guido van Rossum0e548712002-08-09 16:14:33 +0000141
142def _candidate_tempdir_list():
143 """Generate a list of candidate temporary directories which
144 _get_default_tempdir will try."""
145
146 dirlist = []
147
148 # First, try the environment.
149 for envname in 'TMPDIR', 'TEMP', 'TMP':
150 dirname = _os.getenv(envname)
151 if dirname: dirlist.append(dirname)
152
153 # Failing that, try OS-specific locations.
154 if _os.name == 'mac':
155 try:
Jack Jansenbb829b72003-03-21 12:55:38 +0000156 fsr = _Folder.FSFindFolder(_Folders.kOnSystemDisk,
157 _Folders.kTemporaryFolderType, 1)
158 dirname = fsr.as_pathname()
Guido van Rossum0e548712002-08-09 16:14:33 +0000159 dirlist.append(dirname)
Jack Jansenbb829b72003-03-21 12:55:38 +0000160 except _Folder.error:
Guido van Rossum0e548712002-08-09 16:14:33 +0000161 pass
Guido van Rossum0e548712002-08-09 16:14:33 +0000162 elif _os.name == 'nt':
163 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
164 else:
165 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
166
167 # As a last resort, the current directory.
168 try:
169 dirlist.append(_os.getcwd())
170 except (AttributeError, _os.error):
171 dirlist.append(_os.curdir)
172
173 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000174
Guido van Rossum0e548712002-08-09 16:14:33 +0000175def _get_default_tempdir():
176 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000177 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000178
179 We determine whether or not a candidate temp dir is usable by
180 trying to create and write to a file in that directory. If this
181 is successful, the test file is deleted. To prevent denial of
182 service, the name of the test file must be randomized."""
183
184 namer = _RandomNameSequence()
185 dirlist = _candidate_tempdir_list()
186 flags = _text_openflags
187
188 for dir in dirlist:
189 if dir != _os.curdir:
190 dir = _os.path.normcase(_os.path.abspath(dir))
191 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000192 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000193 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000194 filename = _os.path.join(dir, name)
195 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000196 fd = _os.open(filename, flags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000197 fp = _io.open(fd, 'wb')
198 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000199 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000200 _os.unlink(filename)
201 del fp, fd
202 return dir
Guido van Rossumb940e112007-01-10 16:19:56 +0000203 except (OSError, IOError) as e:
Georg Brandl7816e512007-10-22 12:42:46 +0000204 if e.args[0] != _errno.EEXIST:
Guido van Rossum0e548712002-08-09 16:14:33 +0000205 break # no point trying more names in this directory
206 pass
Collin Winterce36ad82007-08-30 01:19:48 +0000207 raise IOError(_errno.ENOENT,
208 "No usable temporary directory found in %s" % dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000209
Guido van Rossume888cdc2002-08-17 14:50:24 +0000210_name_sequence = None
211
Guido van Rossum0e548712002-08-09 16:14:33 +0000212def _get_candidate_names():
213 """Common setup sequence for all user-callable interfaces."""
214
Guido van Rossume888cdc2002-08-17 14:50:24 +0000215 global _name_sequence
216 if _name_sequence is None:
217 _once_lock.acquire()
218 try:
219 if _name_sequence is None:
220 _name_sequence = _RandomNameSequence()
221 finally:
222 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000223 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000224
225
Guido van Rossum0e548712002-08-09 16:14:33 +0000226def _mkstemp_inner(dir, pre, suf, flags):
227 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000228
Guido van Rossum0e548712002-08-09 16:14:33 +0000229 names = _get_candidate_names()
230
Guido van Rossum805365e2007-05-07 22:24:25 +0000231 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000232 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000233 file = _os.path.join(dir, pre + name + suf)
234 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000235 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000236 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000237 return (fd, _os.path.abspath(file))
Guido van Rossumb940e112007-01-10 16:19:56 +0000238 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000239 if e.errno == _errno.EEXIST:
240 continue # try again
241 raise
242
Collin Winterce36ad82007-08-30 01:19:48 +0000243 raise IOError(_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000244
Guido van Rossum0e548712002-08-09 16:14:33 +0000245
246# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000247
Guido van Rossum41f95031992-03-31 19:02:01 +0000248def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000249 """Accessor for tempdir.template."""
250 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000251
Guido van Rossume888cdc2002-08-17 14:50:24 +0000252tempdir = None
253
Guido van Rossum0e548712002-08-09 16:14:33 +0000254def gettempdir():
255 """Accessor for tempdir.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000256 global tempdir
257 if tempdir is None:
258 _once_lock.acquire()
259 try:
260 if tempdir is None:
261 tempdir = _get_default_tempdir()
262 finally:
263 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000264 return tempdir
265
Guido van Rossume888cdc2002-08-17 14:50:24 +0000266def mkstemp(suffix="", prefix=template, dir=None, text=False):
Tim Peters04490bf2002-08-14 15:41:26 +0000267 """mkstemp([suffix, [prefix, [dir, [text]]]])
Guido van Rossum0e548712002-08-09 16:14:33 +0000268 User-callable function to create and return a unique temporary
269 file. The return value is a pair (fd, name) where fd is the
270 file descriptor returned by os.open, and name is the filename.
271
272 If 'suffix' is specified, the file name will end with that suffix,
273 otherwise there will be no suffix.
274
275 If 'prefix' is specified, the file name will begin with that prefix,
276 otherwise a default prefix is used.
277
278 If 'dir' is specified, the file will be created in that directory,
279 otherwise a default directory is used.
280
Tim Peters04490bf2002-08-14 15:41:26 +0000281 If 'text' is specified and true, the file is opened in text
282 mode. Else (the default) the file is opened in binary mode. On
283 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000284
285 The file is readable and writable only by the creating user ID.
286 If the operating system uses permission bits to indicate whether a
287 file is executable, the file is executable by no one. The file
288 descriptor is not inherited by children of this process.
289
290 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000291 """
292
Guido van Rossume888cdc2002-08-17 14:50:24 +0000293 if dir is None:
294 dir = gettempdir()
295
Tim Peters04490bf2002-08-14 15:41:26 +0000296 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000297 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000298 else:
299 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000300
301 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000302
Guido van Rossumeee94981991-11-12 15:38:08 +0000303
Guido van Rossume888cdc2002-08-17 14:50:24 +0000304def mkdtemp(suffix="", prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000305 """mkdtemp([suffix, [prefix, [dir]]])
306 User-callable function to create and return a unique temporary
307 directory. The return value is the pathname of the directory.
308
Tim Peters04490bf2002-08-14 15:41:26 +0000309 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000310 not accepted.
311
312 The directory is readable, writable, and searchable only by the
313 creating user.
314
315 Caller is responsible for deleting the directory when done with it.
316 """
317
Guido van Rossume888cdc2002-08-17 14:50:24 +0000318 if dir is None:
319 dir = gettempdir()
320
Guido van Rossum0e548712002-08-09 16:14:33 +0000321 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000322
Guido van Rossum805365e2007-05-07 22:24:25 +0000323 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000324 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000325 file = _os.path.join(dir, prefix + name + suffix)
326 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000327 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000328 return file
Guido van Rossumb940e112007-01-10 16:19:56 +0000329 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000330 if e.errno == _errno.EEXIST:
331 continue # try again
332 raise
333
Collin Winterce36ad82007-08-30 01:19:48 +0000334 raise IOError(_errno.EEXIST, "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000335
Guido van Rossume888cdc2002-08-17 14:50:24 +0000336def mktemp(suffix="", prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000337 """mktemp([suffix, [prefix, [dir]]])
338 User-callable function to return a unique temporary file name. The
339 file is not created.
340
Tim Peters04490bf2002-08-14 15:41:26 +0000341 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000342 not accepted.
343
344 This function is unsafe and should not be used. The file name
345 refers to a file that did not exist at some point, but by the time
346 you get around to creating it, someone else may have beaten you to
347 the punch.
348 """
349
Guido van Rossum44f602d2002-11-22 15:56:29 +0000350## from warnings import warn as _warn
351## _warn("mktemp is a potential security risk to your program",
352## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000353
Guido van Rossume888cdc2002-08-17 14:50:24 +0000354 if dir is None:
355 dir = gettempdir()
356
Guido van Rossum0e548712002-08-09 16:14:33 +0000357 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000358 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000359 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000360 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000361 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000362 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000363
Collin Winterce36ad82007-08-30 01:19:48 +0000364 raise IOError(_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000365
Christian Heimes3ecfea712008-02-09 20:51:34 +0000366
Guido van Rossum0e548712002-08-09 16:14:33 +0000367class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000368 """Temporary file wrapper
369
Guido van Rossum0e548712002-08-09 16:14:33 +0000370 This class provides a wrapper around files opened for
371 temporary use. In particular, it seeks to automatically
372 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000373 """
Tim Petersa255a722001-12-18 22:32:40 +0000374
Guido van Rossumd8faa362007-04-27 19:54:29 +0000375 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000376 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000377 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000378 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000379 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000380
Guido van Rossumca549821997-08-12 18:00:12 +0000381 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000382 # Attribute lookups are delegated to the underlying file
383 # and cached for non-numeric results
384 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000385 file = self.__dict__['file']
386 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000387 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000388 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000389 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000390
Christian Heimes3ecfea712008-02-09 20:51:34 +0000391 # The underlying __enter__ method returns the wrong object
392 # (self.file) so override it to return the wrapper
393 def __enter__(self):
394 self.file.__enter__()
395 return self
396
Guido van Rossum0e548712002-08-09 16:14:33 +0000397 # NT provides delete-on-close as a primitive, so we don't need
398 # the wrapper to do anything special. We still use it so that
399 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
400 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000401 # Cache the unlinker so we don't get spurious errors at
402 # shutdown when the module-level "os" is None'd out. Note
403 # that this must be referenced as self.unlink, because the
404 # name TemporaryFileWrapper may also get None'd out before
405 # __del__ is called.
406 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000407
Guido van Rossum0e548712002-08-09 16:14:33 +0000408 def close(self):
409 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000410 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000411 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000412 if self.delete:
413 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000414
Guido van Rossum0e548712002-08-09 16:14:33 +0000415 def __del__(self):
416 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000417
Christian Heimes3ecfea712008-02-09 20:51:34 +0000418 # Need to trap __exit__ as well to ensure the file gets
419 # deleted when used in a with statement
420 def __exit__(self, exc, value, tb):
421 result = self.file.__exit__(exc, value, tb)
422 self.close()
423 return result
424
425
Guido van Rossumf0c74162007-08-28 03:29:45 +0000426def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
427 newline=None, suffix="", prefix=template,
428 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000429 """Create and return a temporary file.
430 Arguments:
431 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000432 'mode' -- the mode argument to io.open (default "w+b").
433 'buffering' -- the buffer size argument to io.open (default -1).
434 'encoding' -- the encoding argument to io.open (default None)
435 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000436 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000437 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000438
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000439 Returns an object with a file-like interface; the name of the file
440 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000441 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000442 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000443
Guido van Rossume888cdc2002-08-17 14:50:24 +0000444 if dir is None:
445 dir = gettempdir()
446
Tim Petersc21ea742002-08-13 23:36:01 +0000447 if 'b' in mode:
448 flags = _bin_openflags
449 else:
450 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000451
Guido van Rossum0e548712002-08-09 16:14:33 +0000452 # Setting O_TEMPORARY in the flags causes the OS to delete
453 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000454 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000455 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000456
Guido van Rossum0e548712002-08-09 16:14:33 +0000457 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000458 file = _io.open(fd, mode, buffering=buffering,
459 newline=newline, encoding=encoding)
460
Guido van Rossumd8faa362007-04-27 19:54:29 +0000461 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000462
Jason Tishler80c02af2002-08-14 15:10:09 +0000463if _os.name != 'posix' or _os.sys.platform == 'cygwin':
464 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
465 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000466 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000467
468else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000469 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
470 newline=None, suffix="", prefix=template,
471 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000472 """Create and return a temporary file.
473 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000474 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000475 'mode' -- the mode argument to io.open (default "w+b").
476 'buffering' -- the buffer size argument to io.open (default -1).
477 'encoding' -- the encoding argument to io.open (default None)
478 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000479 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000480
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000481 Returns an object with a file-like interface. The file has no
482 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000483 """
484
Guido van Rossume888cdc2002-08-17 14:50:24 +0000485 if dir is None:
486 dir = gettempdir()
487
Tim Petersc21ea742002-08-13 23:36:01 +0000488 if 'b' in mode:
489 flags = _bin_openflags
490 else:
491 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000492
493 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
494 try:
495 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000496 return _io.open(fd, mode, buffering=buffering,
497 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000498 except:
499 _os.close(fd)
500 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000501
502class SpooledTemporaryFile:
503 """Temporary file wrapper, specialized to switch from
504 StringIO to a real file when it exceeds a certain size or
505 when a fileno is needed.
506 """
507 _rolled = False
508
Guido van Rossumf0c74162007-08-28 03:29:45 +0000509 def __init__(self, max_size=0, mode='w+b', buffering=-1,
510 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000511 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000512 if 'b' in mode:
513 self._file = _io.BytesIO()
514 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000515 # Setting newline="\n" avoids newline translation;
516 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000517 # hget double newline translation upon rollover().
Guido van Rossum5d212552007-10-29 16:42:51 +0000518 self._file = _io.StringIO(encoding=encoding, newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000519 self._max_size = max_size
520 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000521 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
522 'suffix': suffix, 'prefix': prefix,
523 'encoding': encoding, 'newline': newline,
524 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000525
526 def _check(self, file):
527 if self._rolled: return
528 max_size = self._max_size
529 if max_size and file.tell() > max_size:
530 self.rollover()
531
532 def rollover(self):
533 if self._rolled: return
534 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000535 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000536 del self._TemporaryFileArgs
537
538 newfile.write(file.getvalue())
539 newfile.seek(file.tell(), 0)
540
541 self._rolled = True
542
Christian Heimes3ecfea712008-02-09 20:51:34 +0000543 # The method caching trick from NamedTemporaryFile
544 # won't work here, because _file may change from a
545 # _StringIO instance to a real file. So we list
546 # all the methods directly.
547
548 # Context management protocol
549 def __enter__(self):
550 if self._file.closed:
551 raise ValueError("Cannot enter context with closed file")
552 return self
553
554 def __exit__(self, exc, value, tb):
555 self._file.close()
556
Guido van Rossumd8faa362007-04-27 19:54:29 +0000557 # file protocol
558 def __iter__(self):
559 return self._file.__iter__()
560
561 def close(self):
562 self._file.close()
563
564 @property
565 def closed(self):
566 return self._file.closed
567
568 @property
569 def encoding(self):
570 return self._file.encoding
571
572 def fileno(self):
573 self.rollover()
574 return self._file.fileno()
575
576 def flush(self):
577 self._file.flush()
578
579 def isatty(self):
580 return self._file.isatty()
581
582 @property
583 def mode(self):
584 return self._file.mode
585
586 @property
587 def name(self):
588 return self._file.name
589
590 @property
591 def newlines(self):
592 return self._file.newlines
593
594 def next(self):
595 return self._file.next
596
597 def read(self, *args):
598 return self._file.read(*args)
599
600 def readline(self, *args):
601 return self._file.readline(*args)
602
603 def readlines(self, *args):
604 return self._file.readlines(*args)
605
606 def seek(self, *args):
607 self._file.seek(*args)
608
609 @property
610 def softspace(self):
611 return self._file.softspace
612
613 def tell(self):
614 return self._file.tell()
615
616 def truncate(self):
617 self._file.truncate()
618
619 def write(self, s):
620 file = self._file
621 rv = file.write(s)
622 self._check(file)
623 return rv
624
625 def writelines(self, iterable):
626 file = self._file
627 rv = file.writelines(iterable)
628 self._check(file)
629 return rv
630
631 def xreadlines(self, *args):
632 return self._file.xreadlines(*args)