blob: 7e3b25a07025f4555da84117851060dac0da22d3 [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
Yury Selivanov6e7c1402014-09-26 17:07:39 -04004creating temporary files and directories. All of the interfaces
5provided by this module can be used without fear of race conditions
6except for 'mktemp'. 'mktemp' is subject to race conditions and
7should not be used; it is provided for backward compatibility 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
Collin Wintera8785cc2007-03-19 18:52:08 +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
Serhiy Storchaka0127de02013-02-13 00:34:46 +020032import 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 Rossum0e548712002-08-09 16:14:33 +000037try:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000038 from cStringIO import StringIO as _StringIO
Skip Montanaroea59a842008-04-27 22:49:56 +000039except ImportError:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000040 from StringIO import StringIO as _StringIO
Collin Wintera8785cc2007-03-19 18:52:08 +000041
42try:
Guido van Rossum0e548712002-08-09 16:14:33 +000043 import fcntl as _fcntl
Tim Peters90ee7eb2004-07-18 23:58:17 +000044except ImportError:
Tim Peters291f14e2003-07-22 02:50:01 +000045 def _set_cloexec(fd):
46 pass
47else:
Guido van Rossum0e548712002-08-09 16:14:33 +000048 def _set_cloexec(fd):
Tim Peters90ee7eb2004-07-18 23:58:17 +000049 try:
50 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
51 except IOError:
52 pass
Alex Martellif09994e2003-11-09 16:44:09 +000053 else:
Guido van Rossum0e548712002-08-09 16:14:33 +000054 # flags read successfully, modify
55 flags |= _fcntl.FD_CLOEXEC
56 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
Tim Peters291f14e2003-07-22 02:50:01 +000057
Guido van Rossum0e548712002-08-09 16:14:33 +000058
59try:
60 import thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000061except ImportError:
62 import dummy_thread as _thread
63_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000064
65_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000066if hasattr(_os, 'O_NOINHERIT'):
67 _text_openflags |= _os.O_NOINHERIT
68if hasattr(_os, 'O_NOFOLLOW'):
69 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000070
71_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000072if hasattr(_os, 'O_BINARY'):
73 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000074
75if hasattr(_os, 'TMP_MAX'):
76 TMP_MAX = _os.TMP_MAX
77else:
78 TMP_MAX = 10000
79
Tim Petersbd7b4c72002-08-13 23:33:56 +000080template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000081
Guido van Rossum0e548712002-08-09 16:14:33 +000082# Internal routines.
83
84_once_lock = _allocate_lock()
85
Guido van Rossumb256159392003-11-10 02:16:36 +000086if hasattr(_os, "lstat"):
87 _stat = _os.lstat
88elif hasattr(_os, "stat"):
89 _stat = _os.stat
90else:
91 # Fallback. All we need is something that raises os.error if the
92 # file doesn't exist.
93 def _stat(fn):
94 try:
95 f = open(fn)
96 except IOError:
97 raise _os.error
98 f.close()
99
100def _exists(fn):
101 try:
102 _stat(fn)
103 except _os.error:
104 return False
105 else:
106 return True
107
Guido van Rossum0e548712002-08-09 16:14:33 +0000108class _RandomNameSequence:
109 """An instance of _RandomNameSequence generates an endless
110 sequence of unpredictable strings which can safely be incorporated
111 into file names. Each string is six characters long. Multiple
112 threads can safely use the same instance at the same time.
113
114 _RandomNameSequence is an iterator."""
115
Tim Peters97701b52002-11-21 15:59:59 +0000116 characters = ("abcdefghijklmnopqrstuvwxyz" +
117 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
Collin Winter9b2a1092007-03-08 22:16:25 +0000118 "0123456789_")
Guido van Rossum0e548712002-08-09 16:14:33 +0000119
120 def __init__(self):
121 self.mutex = _allocate_lock()
Guido van Rossum0e548712002-08-09 16:14:33 +0000122 self.normcase = _os.path.normcase
Tim Peters97701b52002-11-21 15:59:59 +0000123
Antoine Pitroua5d5bb92011-11-25 21:28:15 +0100124 @property
125 def rng(self):
126 cur_pid = _os.getpid()
127 if cur_pid != getattr(self, '_rng_pid', None):
128 self._rng = _Random()
129 self._rng_pid = cur_pid
130 return self._rng
131
Guido van Rossum0e548712002-08-09 16:14:33 +0000132 def __iter__(self):
133 return self
134
135 def next(self):
136 m = self.mutex
137 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000138 choose = self.rng.choice
Guido van Rossum0e548712002-08-09 16:14:33 +0000139
Tim Peters97701b52002-11-21 15:59:59 +0000140 m.acquire()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000141 try:
Tim Peters97701b52002-11-21 15:59:59 +0000142 letters = [choose(c) for dummy in "123456"]
Guido van Rossum0e548712002-08-09 16:14:33 +0000143 finally:
144 m.release()
145
Tim Peters97701b52002-11-21 15:59:59 +0000146 return self.normcase(''.join(letters))
Guido van Rossum0e548712002-08-09 16:14:33 +0000147
148def _candidate_tempdir_list():
149 """Generate a list of candidate temporary directories which
150 _get_default_tempdir will try."""
151
152 dirlist = []
153
154 # First, try the environment.
155 for envname in 'TMPDIR', 'TEMP', 'TMP':
156 dirname = _os.getenv(envname)
157 if dirname: dirlist.append(dirname)
158
159 # Failing that, try OS-specific locations.
Ronald Oussoren81af68e2008-05-12 11:24:33 +0000160 if _os.name == 'riscos':
Guido van Rossum0e548712002-08-09 16:14:33 +0000161 dirname = _os.getenv('Wimp$ScrapDir')
162 if dirname: dirlist.append(dirname)
163 elif _os.name == 'nt':
164 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
165 else:
166 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
167
168 # As a last resort, the current directory.
169 try:
170 dirlist.append(_os.getcwd())
171 except (AttributeError, _os.error):
172 dirlist.append(_os.curdir)
173
174 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000175
Guido van Rossum0e548712002-08-09 16:14:33 +0000176def _get_default_tempdir():
177 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000178 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000179
180 We determine whether or not a candidate temp dir is usable by
181 trying to create and write to a file in that directory. If this
182 is successful, the test file is deleted. To prevent denial of
183 service, the name of the test file must be randomized."""
184
185 namer = _RandomNameSequence()
186 dirlist = _candidate_tempdir_list()
187 flags = _text_openflags
188
189 for dir in dirlist:
190 if dir != _os.curdir:
191 dir = _os.path.normcase(_os.path.abspath(dir))
192 # Try only a few names per directory.
193 for seq in xrange(100):
194 name = namer.next()
195 filename = _os.path.join(dir, name)
196 try:
Serhiy Storchaka0127de02013-02-13 00:34:46 +0200197 fd = _os.open(filename, flags, 0o600)
198 try:
199 try:
Serhiy Storchaka7d360032013-02-13 00:59:11 +0200200 with _io.open(fd, 'wb', closefd=False) as fp:
201 fp.write(b'blat')
Serhiy Storchaka0127de02013-02-13 00:34:46 +0200202 finally:
203 _os.close(fd)
204 finally:
205 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000206 return dir
Serhiy Storchaka0127de02013-02-13 00:34:46 +0200207 except (OSError, IOError) as e:
Serhiy Storchaka9eb0c0e2015-05-20 00:10:56 +0300208 if e.args[0] == _errno.EEXIST:
209 continue
210 if (_os.name == 'nt' and e.args[0] == _errno.EACCES and
211 _os.path.isdir(dir) and _os.access(dir, _os.W_OK)):
212 # On windows, when a directory with the chosen name already
213 # exists, EACCES error code is returned instead of EEXIST.
214 continue
215 break # no point trying more names in this directory
Guido van Rossum0e548712002-08-09 16:14:33 +0000216 raise IOError, (_errno.ENOENT,
217 ("No usable temporary directory found in %s" % dirlist))
218
Guido van Rossume888cdc2002-08-17 14:50:24 +0000219_name_sequence = None
220
Guido van Rossum0e548712002-08-09 16:14:33 +0000221def _get_candidate_names():
222 """Common setup sequence for all user-callable interfaces."""
223
Guido van Rossume888cdc2002-08-17 14:50:24 +0000224 global _name_sequence
225 if _name_sequence is None:
226 _once_lock.acquire()
227 try:
228 if _name_sequence is None:
229 _name_sequence = _RandomNameSequence()
230 finally:
231 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000232 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000233
234
Guido van Rossum0e548712002-08-09 16:14:33 +0000235def _mkstemp_inner(dir, pre, suf, flags):
236 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000237
Guido van Rossum0e548712002-08-09 16:14:33 +0000238 names = _get_candidate_names()
239
240 for seq in xrange(TMP_MAX):
241 name = names.next()
242 file = _os.path.join(dir, pre + name + suf)
243 try:
244 fd = _os.open(file, flags, 0600)
245 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000246 return (fd, _os.path.abspath(file))
Guido van Rossum0e548712002-08-09 16:14:33 +0000247 except OSError, e:
248 if e.errno == _errno.EEXIST:
249 continue # try again
Serhiy Storchaka9eb0c0e2015-05-20 00:10:56 +0300250 if (_os.name == 'nt' and e.errno == _errno.EACCES and
251 _os.path.isdir(dir) and _os.access(dir, _os.W_OK)):
Eli Bendersky8c7e9252013-09-06 06:17:15 -0700252 # On windows, when a directory with the chosen name already
253 # exists, EACCES error code is returned instead of EEXIST.
254 continue
Guido van Rossum0e548712002-08-09 16:14:33 +0000255 raise
256
257 raise IOError, (_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000258
Guido van Rossum0e548712002-08-09 16:14:33 +0000259
260# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000261
Guido van Rossum41f95031992-03-31 19:02:01 +0000262def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000263 """Accessor for tempdir.template."""
264 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000265
Guido van Rossume888cdc2002-08-17 14:50:24 +0000266tempdir = None
267
Guido van Rossum0e548712002-08-09 16:14:33 +0000268def gettempdir():
Skip Montanaroea59a842008-04-27 22:49:56 +0000269 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000270 global tempdir
271 if tempdir is None:
272 _once_lock.acquire()
273 try:
274 if tempdir is None:
275 tempdir = _get_default_tempdir()
276 finally:
277 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000278 return tempdir
279
Guido van Rossume888cdc2002-08-17 14:50:24 +0000280def mkstemp(suffix="", prefix=template, dir=None, text=False):
Skip Montanaroea59a842008-04-27 22:49:56 +0000281 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000282 file. The return value is a pair (fd, name) where fd is the
283 file descriptor returned by os.open, and name is the filename.
284
285 If 'suffix' is specified, the file name will end with that suffix,
286 otherwise there will be no suffix.
287
288 If 'prefix' is specified, the file name will begin with that prefix,
289 otherwise a default prefix is used.
290
291 If 'dir' is specified, the file will be created in that directory,
292 otherwise a default directory is used.
293
Tim Peters04490bf2002-08-14 15:41:26 +0000294 If 'text' is specified and true, the file is opened in text
295 mode. Else (the default) the file is opened in binary mode. On
296 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000297
298 The file is readable and writable only by the creating user ID.
299 If the operating system uses permission bits to indicate whether a
300 file is executable, the file is executable by no one. The file
301 descriptor is not inherited by children of this process.
302
303 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000304 """
305
Guido van Rossume888cdc2002-08-17 14:50:24 +0000306 if dir is None:
307 dir = gettempdir()
308
Tim Peters04490bf2002-08-14 15:41:26 +0000309 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000310 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000311 else:
312 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000313
314 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000315
Guido van Rossumeee94981991-11-12 15:38:08 +0000316
Guido van Rossume888cdc2002-08-17 14:50:24 +0000317def mkdtemp(suffix="", prefix=template, dir=None):
Skip Montanaroea59a842008-04-27 22:49:56 +0000318 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000319 directory. The return value is the pathname of the directory.
320
Tim Peters04490bf2002-08-14 15:41:26 +0000321 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000322 not accepted.
323
324 The directory is readable, writable, and searchable only by the
325 creating user.
326
327 Caller is responsible for deleting the directory when done with it.
328 """
329
Guido van Rossume888cdc2002-08-17 14:50:24 +0000330 if dir is None:
331 dir = gettempdir()
332
Guido van Rossum0e548712002-08-09 16:14:33 +0000333 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000334
Guido van Rossum0e548712002-08-09 16:14:33 +0000335 for seq in xrange(TMP_MAX):
336 name = names.next()
337 file = _os.path.join(dir, prefix + name + suffix)
338 try:
339 _os.mkdir(file, 0700)
340 return file
341 except OSError, e:
342 if e.errno == _errno.EEXIST:
343 continue # try again
Serhiy Storchaka9eb0c0e2015-05-20 00:10:56 +0300344 if (_os.name == 'nt' and e.errno == _errno.EACCES and
345 _os.path.isdir(dir) and _os.access(dir, _os.W_OK)):
346 # On windows, when a directory with the chosen name already
347 # exists, EACCES error code is returned instead of EEXIST.
348 continue
Guido van Rossum0e548712002-08-09 16:14:33 +0000349 raise
350
351 raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
352
Guido van Rossume888cdc2002-08-17 14:50:24 +0000353def mktemp(suffix="", prefix=template, dir=None):
Skip Montanaroea59a842008-04-27 22:49:56 +0000354 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000355 file is not created.
356
Tim Peters04490bf2002-08-14 15:41:26 +0000357 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000358 not accepted.
359
360 This function is unsafe and should not be used. The file name
361 refers to a file that did not exist at some point, but by the time
362 you get around to creating it, someone else may have beaten you to
363 the punch.
364 """
365
Guido van Rossum44f602d2002-11-22 15:56:29 +0000366## from warnings import warn as _warn
367## _warn("mktemp is a potential security risk to your program",
368## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000369
Guido van Rossume888cdc2002-08-17 14:50:24 +0000370 if dir is None:
371 dir = gettempdir()
372
Guido van Rossum0e548712002-08-09 16:14:33 +0000373 names = _get_candidate_names()
374 for seq in xrange(TMP_MAX):
375 name = names.next()
376 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000377 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000378 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000379
Guido van Rossum0e548712002-08-09 16:14:33 +0000380 raise IOError, (_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000381
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000382
Guido van Rossum0e548712002-08-09 16:14:33 +0000383class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000384 """Temporary file wrapper
385
Guido van Rossum0e548712002-08-09 16:14:33 +0000386 This class provides a wrapper around files opened for
387 temporary use. In particular, it seeks to automatically
388 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000389 """
Tim Petersa255a722001-12-18 22:32:40 +0000390
Georg Brandl35ef9c12007-03-13 18:31:49 +0000391 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000392 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000393 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000394 self.close_called = False
Georg Brandl35ef9c12007-03-13 18:31:49 +0000395 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000396
Guido van Rossumca549821997-08-12 18:00:12 +0000397 def __getattr__(self, name):
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000398 # Attribute lookups are delegated to the underlying file
399 # and cached for non-numeric results
400 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000401 file = self.__dict__['file']
402 a = getattr(file, name)
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000403 if not issubclass(type(a), type(0)):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000404 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000405 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000406
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000407 # The underlying __enter__ method returns the wrong object
408 # (self.file) so override it to return the wrapper
409 def __enter__(self):
410 self.file.__enter__()
411 return self
412
Guido van Rossum0e548712002-08-09 16:14:33 +0000413 # NT provides delete-on-close as a primitive, so we don't need
414 # the wrapper to do anything special. We still use it so that
415 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
416 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000417 # Cache the unlinker so we don't get spurious errors at
418 # shutdown when the module-level "os" is None'd out. Note
419 # that this must be referenced as self.unlink, because the
420 # name TemporaryFileWrapper may also get None'd out before
421 # __del__ is called.
422 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000423
Guido van Rossum0e548712002-08-09 16:14:33 +0000424 def close(self):
425 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000426 self.close_called = True
Serhiy Storchaka1aa2c0f2015-04-10 13:24:10 +0300427 try:
428 self.file.close()
429 finally:
430 if self.delete:
431 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000432
Guido van Rossum0e548712002-08-09 16:14:33 +0000433 def __del__(self):
434 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000435
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000436 # Need to trap __exit__ as well to ensure the file gets
437 # deleted when used in a with statement
438 def __exit__(self, exc, value, tb):
439 result = self.file.__exit__(exc, value, tb)
440 self.close()
441 return result
Benjamin Peterson31f42ab2009-06-30 22:14:33 +0000442 else:
443 def __exit__(self, exc, value, tb):
Benjamin Peterson4f247672009-07-01 13:34:35 +0000444 self.file.__exit__(exc, value, tb)
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000445
446
Guido van Rossum0e548712002-08-09 16:14:33 +0000447def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
Georg Brandl35ef9c12007-03-13 18:31:49 +0000448 prefix=template, dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000449 """Create and return a temporary file.
450 Arguments:
451 'prefix', 'suffix', 'dir' -- as for mkstemp.
452 'mode' -- the mode argument to os.fdopen (default "w+b").
453 'bufsize' -- the buffer size argument to os.fdopen (default -1).
Georg Brandl35ef9c12007-03-13 18:31:49 +0000454 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000455 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000456
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000457 Returns an object with a file-like interface; the name of the file
Martin Panterbe9ddc12016-02-22 10:10:00 +0000458 is accessible as its 'name' attribute. The file will be automatically
459 deleted when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000460 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000461
Guido van Rossume888cdc2002-08-17 14:50:24 +0000462 if dir is None:
463 dir = gettempdir()
464
Tim Petersc21ea742002-08-13 23:36:01 +0000465 if 'b' in mode:
466 flags = _bin_openflags
467 else:
468 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000469
Guido van Rossum0e548712002-08-09 16:14:33 +0000470 # Setting O_TEMPORARY in the flags causes the OS to delete
471 # the file when it is closed. This is only supported by Windows.
Georg Brandl35ef9c12007-03-13 18:31:49 +0000472 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000473 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000474
Guido van Rossum0e548712002-08-09 16:14:33 +0000475 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Victor Stinner367f5d32014-03-25 09:08:16 +0100476 try:
477 file = _os.fdopen(fd, mode, bufsize)
478 return _TemporaryFileWrapper(file, name, delete)
Martin Panterb6b1ab42016-02-29 00:31:38 +0000479 except BaseException:
480 _os.unlink(name)
Victor Stinner367f5d32014-03-25 09:08:16 +0100481 _os.close(fd)
482 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000483
Jason Tishler80c02af2002-08-14 15:10:09 +0000484if _os.name != 'posix' or _os.sys.platform == 'cygwin':
485 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
486 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000487 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000488
489else:
Guido van Rossum0e548712002-08-09 16:14:33 +0000490 def TemporaryFile(mode='w+b', bufsize=-1, suffix="",
Guido van Rossume888cdc2002-08-17 14:50:24 +0000491 prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000492 """Create and return a temporary file.
493 Arguments:
Neal Norwitz946aea22006-06-16 04:31:06 +0000494 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossum0e548712002-08-09 16:14:33 +0000495 'mode' -- the mode argument to os.fdopen (default "w+b").
496 'bufsize' -- the buffer size argument to os.fdopen (default -1).
497 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000498
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000499 Returns an object with a file-like interface. The file has no
500 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000501 """
502
Guido van Rossume888cdc2002-08-17 14:50:24 +0000503 if dir is None:
504 dir = gettempdir()
505
Tim Petersc21ea742002-08-13 23:36:01 +0000506 if 'b' in mode:
507 flags = _bin_openflags
508 else:
509 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000510
511 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
512 try:
513 _os.unlink(name)
514 return _os.fdopen(fd, mode, bufsize)
515 except:
516 _os.close(fd)
517 raise
Collin Wintera8785cc2007-03-19 18:52:08 +0000518
519class SpooledTemporaryFile:
520 """Temporary file wrapper, specialized to switch from
521 StringIO to a real file when it exceeds a certain size or
522 when a fileno is needed.
523 """
524 _rolled = False
525
526 def __init__(self, max_size=0, mode='w+b', bufsize=-1,
527 suffix="", prefix=template, dir=None):
528 self._file = _StringIO()
529 self._max_size = max_size
530 self._rolled = False
531 self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir)
532
533 def _check(self, file):
534 if self._rolled: return
535 max_size = self._max_size
536 if max_size and file.tell() > max_size:
537 self.rollover()
538
539 def rollover(self):
540 if self._rolled: return
541 file = self._file
542 newfile = self._file = TemporaryFile(*self._TemporaryFileArgs)
543 del self._TemporaryFileArgs
544
545 newfile.write(file.getvalue())
546 newfile.seek(file.tell(), 0)
547
548 self._rolled = True
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000549
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000550 # The method caching trick from NamedTemporaryFile
551 # won't work here, because _file may change from a
552 # _StringIO instance to a real file. So we list
553 # all the methods directly.
554
555 # Context management protocol
556 def __enter__(self):
557 if self._file.closed:
558 raise ValueError("Cannot enter context with closed file")
559 return self
560
561 def __exit__(self, exc, value, tb):
562 self._file.close()
563
Collin Wintera8785cc2007-03-19 18:52:08 +0000564 # file protocol
565 def __iter__(self):
566 return self._file.__iter__()
567
568 def close(self):
569 self._file.close()
570
571 @property
572 def closed(self):
573 return self._file.closed
574
Collin Wintera8785cc2007-03-19 18:52:08 +0000575 def fileno(self):
576 self.rollover()
577 return self._file.fileno()
578
579 def flush(self):
580 self._file.flush()
581
582 def isatty(self):
583 return self._file.isatty()
584
585 @property
586 def mode(self):
Serhiy Storchakabeaa3ad2013-02-09 12:20:18 +0200587 try:
588 return self._file.mode
589 except AttributeError:
590 return self._TemporaryFileArgs[0]
Collin Wintera8785cc2007-03-19 18:52:08 +0000591
592 @property
593 def name(self):
Serhiy Storchakabeaa3ad2013-02-09 12:20:18 +0200594 try:
595 return self._file.name
596 except AttributeError:
597 return None
Collin Wintera8785cc2007-03-19 18:52:08 +0000598
599 def next(self):
600 return self._file.next
601
602 def read(self, *args):
603 return self._file.read(*args)
604
605 def readline(self, *args):
606 return self._file.readline(*args)
607
608 def readlines(self, *args):
609 return self._file.readlines(*args)
610
611 def seek(self, *args):
612 self._file.seek(*args)
613
614 @property
615 def softspace(self):
616 return self._file.softspace
617
618 def tell(self):
619 return self._file.tell()
620
621 def truncate(self):
622 self._file.truncate()
623
624 def write(self, s):
625 file = self._file
626 rv = file.write(s)
627 self._check(file)
628 return rv
629
630 def writelines(self, iterable):
631 file = self._file
632 rv = file.writelines(iterable)
633 self._check(file)
634 return rv
635
636 def xreadlines(self, *args):
Terry Jan Reedy6c1d9dd2013-06-30 13:57:57 -0400637 if hasattr(self._file, 'xreadlines'): # real file
638 return iter(self._file)
639 else: # StringIO()
Serhiy Storchakabeaa3ad2013-02-09 12:20:18 +0200640 return iter(self._file.readlines(*args))