blob: 0e2a4606a6800466df80c2fc922e1d12bdc0e674 [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
Guido van Rossum0e548712002-08-09 16:14:33 +000081# Internal routines.
82
83_once_lock = _allocate_lock()
84
Guido van Rossumb256159392003-11-10 02:16:36 +000085if hasattr(_os, "lstat"):
86 _stat = _os.lstat
87elif hasattr(_os, "stat"):
88 _stat = _os.stat
89else:
90 # Fallback. All we need is something that raises os.error if the
91 # file doesn't exist.
92 def _stat(fn):
93 try:
94 f = open(fn)
95 except IOError:
96 raise _os.error
97 f.close()
98
99def _exists(fn):
100 try:
101 _stat(fn)
102 except _os.error:
103 return False
104 else:
105 return True
106
Guido van Rossum0e548712002-08-09 16:14:33 +0000107class _RandomNameSequence:
108 """An instance of _RandomNameSequence generates an endless
109 sequence of unpredictable strings which can safely be incorporated
110 into file names. Each string is six characters long. Multiple
111 threads can safely use the same instance at the same time.
112
113 _RandomNameSequence is an iterator."""
114
Tim Peters97701b52002-11-21 15:59:59 +0000115 characters = ("abcdefghijklmnopqrstuvwxyz" +
116 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
Guido van Rossumd8faa362007-04-27 19:54:29 +0000117 "0123456789_")
Guido van Rossum0e548712002-08-09 16:14:33 +0000118
119 def __init__(self):
120 self.mutex = _allocate_lock()
121 self.rng = _Random()
122 self.normcase = _os.path.normcase
Tim Peters97701b52002-11-21 15:59:59 +0000123
Guido van Rossum0e548712002-08-09 16:14:33 +0000124 def __iter__(self):
125 return self
126
Georg Brandla18af4e2007-04-21 15:47:16 +0000127 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000128 m = self.mutex
129 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000130 choose = self.rng.choice
Guido van Rossum0e548712002-08-09 16:14:33 +0000131
Tim Peters97701b52002-11-21 15:59:59 +0000132 m.acquire()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000133 try:
Tim Peters97701b52002-11-21 15:59:59 +0000134 letters = [choose(c) for dummy in "123456"]
Guido van Rossum0e548712002-08-09 16:14:33 +0000135 finally:
136 m.release()
137
Tim Peters97701b52002-11-21 15:59:59 +0000138 return self.normcase(''.join(letters))
Guido van Rossum0e548712002-08-09 16:14:33 +0000139
140def _candidate_tempdir_list():
141 """Generate a list of candidate temporary directories which
142 _get_default_tempdir will try."""
143
144 dirlist = []
145
146 # First, try the environment.
147 for envname in 'TMPDIR', 'TEMP', 'TMP':
148 dirname = _os.getenv(envname)
149 if dirname: dirlist.append(dirname)
150
151 # Failing that, try OS-specific locations.
152 if _os.name == 'mac':
153 try:
Jack Jansenbb829b72003-03-21 12:55:38 +0000154 fsr = _Folder.FSFindFolder(_Folders.kOnSystemDisk,
155 _Folders.kTemporaryFolderType, 1)
156 dirname = fsr.as_pathname()
Guido van Rossum0e548712002-08-09 16:14:33 +0000157 dirlist.append(dirname)
Jack Jansenbb829b72003-03-21 12:55:38 +0000158 except _Folder.error:
Guido van Rossum0e548712002-08-09 16:14:33 +0000159 pass
Guido van Rossum0e548712002-08-09 16:14:33 +0000160 elif _os.name == 'nt':
161 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
162 else:
163 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
164
165 # As a last resort, the current directory.
166 try:
167 dirlist.append(_os.getcwd())
168 except (AttributeError, _os.error):
169 dirlist.append(_os.curdir)
170
171 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000172
Guido van Rossum0e548712002-08-09 16:14:33 +0000173def _get_default_tempdir():
174 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000175 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000176
177 We determine whether or not a candidate temp dir is usable by
178 trying to create and write to a file in that directory. If this
179 is successful, the test file is deleted. To prevent denial of
180 service, the name of the test file must be randomized."""
181
182 namer = _RandomNameSequence()
183 dirlist = _candidate_tempdir_list()
184 flags = _text_openflags
185
186 for dir in dirlist:
187 if dir != _os.curdir:
188 dir = _os.path.normcase(_os.path.abspath(dir))
189 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000190 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000191 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000192 filename = _os.path.join(dir, name)
193 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000194 fd = _os.open(filename, flags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000195 fp = _io.open(fd, 'wb')
196 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000197 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000198 _os.unlink(filename)
199 del fp, fd
200 return dir
Guido van Rossumb940e112007-01-10 16:19:56 +0000201 except (OSError, IOError) as e:
Georg Brandl7816e512007-10-22 12:42:46 +0000202 if e.args[0] != _errno.EEXIST:
Guido van Rossum0e548712002-08-09 16:14:33 +0000203 break # no point trying more names in this directory
204 pass
Collin Winterce36ad82007-08-30 01:19:48 +0000205 raise IOError(_errno.ENOENT,
206 "No usable temporary directory found in %s" % dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000207
Guido van Rossume888cdc2002-08-17 14:50:24 +0000208_name_sequence = None
209
Guido van Rossum0e548712002-08-09 16:14:33 +0000210def _get_candidate_names():
211 """Common setup sequence for all user-callable interfaces."""
212
Guido van Rossume888cdc2002-08-17 14:50:24 +0000213 global _name_sequence
214 if _name_sequence is None:
215 _once_lock.acquire()
216 try:
217 if _name_sequence is None:
218 _name_sequence = _RandomNameSequence()
219 finally:
220 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000221 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000222
223
Guido van Rossum0e548712002-08-09 16:14:33 +0000224def _mkstemp_inner(dir, pre, suf, flags):
225 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000226
Guido van Rossum0e548712002-08-09 16:14:33 +0000227 names = _get_candidate_names()
228
Guido van Rossum805365e2007-05-07 22:24:25 +0000229 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000230 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000231 file = _os.path.join(dir, pre + name + suf)
232 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000233 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000234 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000235 return (fd, _os.path.abspath(file))
Guido van Rossumb940e112007-01-10 16:19:56 +0000236 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000237 if e.errno == _errno.EEXIST:
238 continue # try again
239 raise
240
Collin Winterce36ad82007-08-30 01:19:48 +0000241 raise IOError(_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000242
Guido van Rossum0e548712002-08-09 16:14:33 +0000243
244# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000245
Guido van Rossum41f95031992-03-31 19:02:01 +0000246def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000247 """Accessor for tempdir.template."""
248 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000249
Guido van Rossume888cdc2002-08-17 14:50:24 +0000250tempdir = None
251
Guido van Rossum0e548712002-08-09 16:14:33 +0000252def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000253 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000254 global tempdir
255 if tempdir is None:
256 _once_lock.acquire()
257 try:
258 if tempdir is None:
259 tempdir = _get_default_tempdir()
260 finally:
261 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000262 return tempdir
263
Guido van Rossume888cdc2002-08-17 14:50:24 +0000264def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000265 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000266 file. The return value is a pair (fd, name) where fd is the
267 file descriptor returned by os.open, and name is the filename.
268
269 If 'suffix' is specified, the file name will end with that suffix,
270 otherwise there will be no suffix.
271
272 If 'prefix' is specified, the file name will begin with that prefix,
273 otherwise a default prefix is used.
274
275 If 'dir' is specified, the file will be created in that directory,
276 otherwise a default directory is used.
277
Tim Peters04490bf2002-08-14 15:41:26 +0000278 If 'text' is specified and true, the file is opened in text
279 mode. Else (the default) the file is opened in binary mode. On
280 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000281
282 The file is readable and writable only by the creating user ID.
283 If the operating system uses permission bits to indicate whether a
284 file is executable, the file is executable by no one. The file
285 descriptor is not inherited by children of this process.
286
287 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000288 """
289
Guido van Rossume888cdc2002-08-17 14:50:24 +0000290 if dir is None:
291 dir = gettempdir()
292
Tim Peters04490bf2002-08-14 15:41:26 +0000293 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000294 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000295 else:
296 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000297
298 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000299
Guido van Rossumeee94981991-11-12 15:38:08 +0000300
Guido van Rossume888cdc2002-08-17 14:50:24 +0000301def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000302 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000303 directory. The return value is the pathname of the directory.
304
Tim Peters04490bf2002-08-14 15:41:26 +0000305 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000306 not accepted.
307
308 The directory is readable, writable, and searchable only by the
309 creating user.
310
311 Caller is responsible for deleting the directory when done with it.
312 """
313
Guido van Rossume888cdc2002-08-17 14:50:24 +0000314 if dir is None:
315 dir = gettempdir()
316
Guido van Rossum0e548712002-08-09 16:14:33 +0000317 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000318
Guido van Rossum805365e2007-05-07 22:24:25 +0000319 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000320 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000321 file = _os.path.join(dir, prefix + name + suffix)
322 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000323 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000324 return file
Guido van Rossumb940e112007-01-10 16:19:56 +0000325 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000326 if e.errno == _errno.EEXIST:
327 continue # try again
328 raise
329
Collin Winterce36ad82007-08-30 01:19:48 +0000330 raise IOError(_errno.EEXIST, "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000331
Guido van Rossume888cdc2002-08-17 14:50:24 +0000332def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000333 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000334 file is not created.
335
Tim Peters04490bf2002-08-14 15:41:26 +0000336 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000337 not accepted.
338
339 This function is unsafe and should not be used. The file name
340 refers to a file that did not exist at some point, but by the time
341 you get around to creating it, someone else may have beaten you to
342 the punch.
343 """
344
Guido van Rossum44f602d2002-11-22 15:56:29 +0000345## from warnings import warn as _warn
346## _warn("mktemp is a potential security risk to your program",
347## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000348
Guido van Rossume888cdc2002-08-17 14:50:24 +0000349 if dir is None:
350 dir = gettempdir()
351
Guido van Rossum0e548712002-08-09 16:14:33 +0000352 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000353 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000354 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000355 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000356 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000357 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000358
Collin Winterce36ad82007-08-30 01:19:48 +0000359 raise IOError(_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000360
Christian Heimes3ecfea712008-02-09 20:51:34 +0000361
Guido van Rossum0e548712002-08-09 16:14:33 +0000362class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000363 """Temporary file wrapper
364
Guido van Rossum0e548712002-08-09 16:14:33 +0000365 This class provides a wrapper around files opened for
366 temporary use. In particular, it seeks to automatically
367 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000368 """
Tim Petersa255a722001-12-18 22:32:40 +0000369
Guido van Rossumd8faa362007-04-27 19:54:29 +0000370 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000371 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000372 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000373 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000374 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000375
Guido van Rossumca549821997-08-12 18:00:12 +0000376 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000377 # Attribute lookups are delegated to the underlying file
378 # and cached for non-numeric results
379 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000380 file = self.__dict__['file']
381 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000382 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000383 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000384 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000385
Christian Heimes3ecfea712008-02-09 20:51:34 +0000386 # The underlying __enter__ method returns the wrong object
387 # (self.file) so override it to return the wrapper
388 def __enter__(self):
389 self.file.__enter__()
390 return self
391
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000392 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000393 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000394 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000395
Guido van Rossum0e548712002-08-09 16:14:33 +0000396 # NT provides delete-on-close as a primitive, so we don't need
397 # the wrapper to do anything special. We still use it so that
398 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
399 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000400 # Cache the unlinker so we don't get spurious errors at
401 # shutdown when the module-level "os" is None'd out. Note
402 # that this must be referenced as self.unlink, because the
403 # name TemporaryFileWrapper may also get None'd out before
404 # __del__ is called.
405 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000406
Guido van Rossum0e548712002-08-09 16:14:33 +0000407 def close(self):
408 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000409 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000410 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000411 if self.delete:
412 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000413
Guido van Rossum0e548712002-08-09 16:14:33 +0000414 def __del__(self):
415 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000416
Christian Heimes3ecfea712008-02-09 20:51:34 +0000417 # Need to trap __exit__ as well to ensure the file gets
418 # deleted when used in a with statement
419 def __exit__(self, exc, value, tb):
420 result = self.file.__exit__(exc, value, tb)
421 self.close()
422 return result
423
424
Guido van Rossumf0c74162007-08-28 03:29:45 +0000425def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
426 newline=None, suffix="", prefix=template,
427 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000428 """Create and return a temporary file.
429 Arguments:
430 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000431 'mode' -- the mode argument to io.open (default "w+b").
432 'buffering' -- the buffer size argument to io.open (default -1).
433 'encoding' -- the encoding argument to io.open (default None)
434 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000435 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000436 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000437
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000438 Returns an object with a file-like interface; the name of the file
439 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000440 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000441 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000442
Guido van Rossume888cdc2002-08-17 14:50:24 +0000443 if dir is None:
444 dir = gettempdir()
445
Tim Petersc21ea742002-08-13 23:36:01 +0000446 if 'b' in mode:
447 flags = _bin_openflags
448 else:
449 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000450
Guido van Rossum0e548712002-08-09 16:14:33 +0000451 # Setting O_TEMPORARY in the flags causes the OS to delete
452 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000453 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000454 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000455
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000457 file = _io.open(fd, mode, buffering=buffering,
458 newline=newline, encoding=encoding)
459
Guido van Rossumd8faa362007-04-27 19:54:29 +0000460 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000461
Jason Tishler80c02af2002-08-14 15:10:09 +0000462if _os.name != 'posix' or _os.sys.platform == 'cygwin':
463 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
464 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000465 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000466
467else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000468 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
469 newline=None, suffix="", prefix=template,
470 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000471 """Create and return a temporary file.
472 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000473 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000474 'mode' -- the mode argument to io.open (default "w+b").
475 'buffering' -- the buffer size argument to io.open (default -1).
476 'encoding' -- the encoding argument to io.open (default None)
477 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000478 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000479
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000480 Returns an object with a file-like interface. The file has no
481 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000482 """
483
Guido van Rossume888cdc2002-08-17 14:50:24 +0000484 if dir is None:
485 dir = gettempdir()
486
Tim Petersc21ea742002-08-13 23:36:01 +0000487 if 'b' in mode:
488 flags = _bin_openflags
489 else:
490 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000491
492 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
493 try:
494 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000495 return _io.open(fd, mode, buffering=buffering,
496 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000497 except:
498 _os.close(fd)
499 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000500
501class SpooledTemporaryFile:
502 """Temporary file wrapper, specialized to switch from
503 StringIO to a real file when it exceeds a certain size or
504 when a fileno is needed.
505 """
506 _rolled = False
507
Guido van Rossumf0c74162007-08-28 03:29:45 +0000508 def __init__(self, max_size=0, mode='w+b', buffering=-1,
509 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000510 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000511 if 'b' in mode:
512 self._file = _io.BytesIO()
513 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000514 # Setting newline="\n" avoids newline translation;
515 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000516 # hget double newline translation upon rollover().
Guido van Rossum5d212552007-10-29 16:42:51 +0000517 self._file = _io.StringIO(encoding=encoding, newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000518 self._max_size = max_size
519 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000520 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
521 'suffix': suffix, 'prefix': prefix,
522 'encoding': encoding, 'newline': newline,
523 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000524
525 def _check(self, file):
526 if self._rolled: return
527 max_size = self._max_size
528 if max_size and file.tell() > max_size:
529 self.rollover()
530
531 def rollover(self):
532 if self._rolled: return
533 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000534 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000535 del self._TemporaryFileArgs
536
537 newfile.write(file.getvalue())
538 newfile.seek(file.tell(), 0)
539
540 self._rolled = True
541
Christian Heimes3ecfea712008-02-09 20:51:34 +0000542 # The method caching trick from NamedTemporaryFile
543 # won't work here, because _file may change from a
544 # _StringIO instance to a real file. So we list
545 # all the methods directly.
546
547 # Context management protocol
548 def __enter__(self):
549 if self._file.closed:
550 raise ValueError("Cannot enter context with closed file")
551 return self
552
553 def __exit__(self, exc, value, tb):
554 self._file.close()
555
Guido van Rossumd8faa362007-04-27 19:54:29 +0000556 # file protocol
557 def __iter__(self):
558 return self._file.__iter__()
559
560 def close(self):
561 self._file.close()
562
563 @property
564 def closed(self):
565 return self._file.closed
566
567 @property
568 def encoding(self):
569 return self._file.encoding
570
571 def fileno(self):
572 self.rollover()
573 return self._file.fileno()
574
575 def flush(self):
576 self._file.flush()
577
578 def isatty(self):
579 return self._file.isatty()
580
581 @property
582 def mode(self):
583 return self._file.mode
584
585 @property
586 def name(self):
587 return self._file.name
588
589 @property
590 def newlines(self):
591 return self._file.newlines
592
593 def next(self):
594 return self._file.next
595
596 def read(self, *args):
597 return self._file.read(*args)
598
599 def readline(self, *args):
600 return self._file.readline(*args)
601
602 def readlines(self, *args):
603 return self._file.readlines(*args)
604
605 def seek(self, *args):
606 self._file.seek(*args)
607
608 @property
609 def softspace(self):
610 return self._file.softspace
611
612 def tell(self):
613 return self._file.tell()
614
615 def truncate(self):
616 self._file.truncate()
617
618 def write(self, s):
619 file = self._file
620 rv = file.write(s)
621 self._check(file)
622 return rv
623
624 def writelines(self, iterable):
625 file = self._file
626 rv = file.writelines(iterable)
627 self._check(file)
628 return rv
629
630 def xreadlines(self, *args):
631 return self._file.xreadlines(*args)