blob: df1317d587dc074eccc68bd1232a15b38119cd48 [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
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000397 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000398 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000399 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000400
Guido van Rossum0e548712002-08-09 16:14:33 +0000401 # NT provides delete-on-close as a primitive, so we don't need
402 # the wrapper to do anything special. We still use it so that
403 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
404 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000405 # Cache the unlinker so we don't get spurious errors at
406 # shutdown when the module-level "os" is None'd out. Note
407 # that this must be referenced as self.unlink, because the
408 # name TemporaryFileWrapper may also get None'd out before
409 # __del__ is called.
410 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000411
Guido van Rossum0e548712002-08-09 16:14:33 +0000412 def close(self):
413 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000414 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000415 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000416 if self.delete:
417 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000418
Guido van Rossum0e548712002-08-09 16:14:33 +0000419 def __del__(self):
420 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000421
Christian Heimes3ecfea712008-02-09 20:51:34 +0000422 # Need to trap __exit__ as well to ensure the file gets
423 # deleted when used in a with statement
424 def __exit__(self, exc, value, tb):
425 result = self.file.__exit__(exc, value, tb)
426 self.close()
427 return result
428
429
Guido van Rossumf0c74162007-08-28 03:29:45 +0000430def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
431 newline=None, suffix="", prefix=template,
432 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000433 """Create and return a temporary file.
434 Arguments:
435 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000436 'mode' -- the mode argument to io.open (default "w+b").
437 'buffering' -- the buffer size argument to io.open (default -1).
438 'encoding' -- the encoding argument to io.open (default None)
439 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000440 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000441 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000442
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000443 Returns an object with a file-like interface; the name of the file
444 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000445 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000446 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000447
Guido van Rossume888cdc2002-08-17 14:50:24 +0000448 if dir is None:
449 dir = gettempdir()
450
Tim Petersc21ea742002-08-13 23:36:01 +0000451 if 'b' in mode:
452 flags = _bin_openflags
453 else:
454 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000455
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 # Setting O_TEMPORARY in the flags causes the OS to delete
457 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000458 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000459 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000460
Guido van Rossum0e548712002-08-09 16:14:33 +0000461 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000462 file = _io.open(fd, mode, buffering=buffering,
463 newline=newline, encoding=encoding)
464
Guido van Rossumd8faa362007-04-27 19:54:29 +0000465 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000466
Jason Tishler80c02af2002-08-14 15:10:09 +0000467if _os.name != 'posix' or _os.sys.platform == 'cygwin':
468 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
469 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000470 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000471
472else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000473 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
474 newline=None, suffix="", prefix=template,
475 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000476 """Create and return a temporary file.
477 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000478 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000479 'mode' -- the mode argument to io.open (default "w+b").
480 'buffering' -- the buffer size argument to io.open (default -1).
481 'encoding' -- the encoding argument to io.open (default None)
482 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000483 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000484
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000485 Returns an object with a file-like interface. The file has no
486 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000487 """
488
Guido van Rossume888cdc2002-08-17 14:50:24 +0000489 if dir is None:
490 dir = gettempdir()
491
Tim Petersc21ea742002-08-13 23:36:01 +0000492 if 'b' in mode:
493 flags = _bin_openflags
494 else:
495 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000496
497 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
498 try:
499 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000500 return _io.open(fd, mode, buffering=buffering,
501 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000502 except:
503 _os.close(fd)
504 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000505
506class SpooledTemporaryFile:
507 """Temporary file wrapper, specialized to switch from
508 StringIO to a real file when it exceeds a certain size or
509 when a fileno is needed.
510 """
511 _rolled = False
512
Guido van Rossumf0c74162007-08-28 03:29:45 +0000513 def __init__(self, max_size=0, mode='w+b', buffering=-1,
514 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000515 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000516 if 'b' in mode:
517 self._file = _io.BytesIO()
518 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000519 # Setting newline="\n" avoids newline translation;
520 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000521 # hget double newline translation upon rollover().
Guido van Rossum5d212552007-10-29 16:42:51 +0000522 self._file = _io.StringIO(encoding=encoding, newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000523 self._max_size = max_size
524 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000525 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
526 'suffix': suffix, 'prefix': prefix,
527 'encoding': encoding, 'newline': newline,
528 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000529
530 def _check(self, file):
531 if self._rolled: return
532 max_size = self._max_size
533 if max_size and file.tell() > max_size:
534 self.rollover()
535
536 def rollover(self):
537 if self._rolled: return
538 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000539 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000540 del self._TemporaryFileArgs
541
542 newfile.write(file.getvalue())
543 newfile.seek(file.tell(), 0)
544
545 self._rolled = True
546
Christian Heimes3ecfea712008-02-09 20:51:34 +0000547 # The method caching trick from NamedTemporaryFile
548 # won't work here, because _file may change from a
549 # _StringIO instance to a real file. So we list
550 # all the methods directly.
551
552 # Context management protocol
553 def __enter__(self):
554 if self._file.closed:
555 raise ValueError("Cannot enter context with closed file")
556 return self
557
558 def __exit__(self, exc, value, tb):
559 self._file.close()
560
Guido van Rossumd8faa362007-04-27 19:54:29 +0000561 # file protocol
562 def __iter__(self):
563 return self._file.__iter__()
564
565 def close(self):
566 self._file.close()
567
568 @property
569 def closed(self):
570 return self._file.closed
571
572 @property
573 def encoding(self):
574 return self._file.encoding
575
576 def fileno(self):
577 self.rollover()
578 return self._file.fileno()
579
580 def flush(self):
581 self._file.flush()
582
583 def isatty(self):
584 return self._file.isatty()
585
586 @property
587 def mode(self):
588 return self._file.mode
589
590 @property
591 def name(self):
592 return self._file.name
593
594 @property
595 def newlines(self):
596 return self._file.newlines
597
598 def next(self):
599 return self._file.next
600
601 def read(self, *args):
602 return self._file.read(*args)
603
604 def readline(self, *args):
605 return self._file.readline(*args)
606
607 def readlines(self, *args):
608 return self._file.readlines(*args)
609
610 def seek(self, *args):
611 self._file.seek(*args)
612
613 @property
614 def softspace(self):
615 return self._file.softspace
616
617 def tell(self):
618 return self._file.tell()
619
620 def truncate(self):
621 self._file.truncate()
622
623 def write(self, s):
624 file = self._file
625 rv = file.write(s)
626 self._check(file)
627 return rv
628
629 def writelines(self, iterable):
630 file = self._file
631 rv = file.writelines(iterable)
632 self._check(file)
633 return rv
634
635 def xreadlines(self, *args):
636 return self._file.xreadlines(*args)