blob: 2023280d037363d495e230946720544a64b49fbf [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
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
Guido van Rossum0e548712002-08-09 16:14:33 +000032import os as _os
33import errno as _errno
34from random import Random as _Random
35
Guido van Rossum0e548712002-08-09 16:14:33 +000036try:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000037 from cStringIO import StringIO as _StringIO
Skip Montanaroea59a842008-04-27 22:49:56 +000038except ImportError:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000039 from StringIO import StringIO as _StringIO
Collin Wintera8785cc2007-03-19 18:52:08 +000040
41try:
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" +
Collin Winter9b2a1092007-03-08 22:16:25 +0000117 "0123456789_")
Guido van Rossum0e548712002-08-09 16:14:33 +0000118
119 def __init__(self):
120 self.mutex = _allocate_lock()
Guido van Rossum0e548712002-08-09 16:14:33 +0000121 self.normcase = _os.path.normcase
Tim Peters97701b52002-11-21 15:59:59 +0000122
Antoine Pitroua5d5bb92011-11-25 21:28:15 +0100123 @property
124 def rng(self):
125 cur_pid = _os.getpid()
126 if cur_pid != getattr(self, '_rng_pid', None):
127 self._rng = _Random()
128 self._rng_pid = cur_pid
129 return self._rng
130
Guido van Rossum0e548712002-08-09 16:14:33 +0000131 def __iter__(self):
132 return self
133
134 def next(self):
135 m = self.mutex
136 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000137 choose = self.rng.choice
Guido van Rossum0e548712002-08-09 16:14:33 +0000138
Tim Peters97701b52002-11-21 15:59:59 +0000139 m.acquire()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000140 try:
Tim Peters97701b52002-11-21 15:59:59 +0000141 letters = [choose(c) for dummy in "123456"]
Guido van Rossum0e548712002-08-09 16:14:33 +0000142 finally:
143 m.release()
144
Tim Peters97701b52002-11-21 15:59:59 +0000145 return self.normcase(''.join(letters))
Guido van Rossum0e548712002-08-09 16:14:33 +0000146
147def _candidate_tempdir_list():
148 """Generate a list of candidate temporary directories which
149 _get_default_tempdir will try."""
150
151 dirlist = []
152
153 # First, try the environment.
154 for envname in 'TMPDIR', 'TEMP', 'TMP':
155 dirname = _os.getenv(envname)
156 if dirname: dirlist.append(dirname)
157
158 # Failing that, try OS-specific locations.
Ronald Oussoren81af68e2008-05-12 11:24:33 +0000159 if _os.name == 'riscos':
Guido van Rossum0e548712002-08-09 16:14:33 +0000160 dirname = _os.getenv('Wimp$ScrapDir')
161 if dirname: dirlist.append(dirname)
162 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.
192 for seq in xrange(100):
193 name = namer.next()
194 filename = _os.path.join(dir, name)
195 try:
196 fd = _os.open(filename, flags, 0600)
197 fp = _os.fdopen(fd, 'w')
Tim Petersb90f89a2001-01-15 03:26:36 +0000198 fp.write('blat')
199 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000200 _os.unlink(filename)
201 del fp, fd
202 return dir
203 except (OSError, IOError), e:
204 if e[0] != _errno.EEXIST:
205 break # no point trying more names in this directory
206 pass
207 raise IOError, (_errno.ENOENT,
208 ("No usable temporary directory found in %s" % dirlist))
209
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
231 for seq in xrange(TMP_MAX):
232 name = names.next()
233 file = _os.path.join(dir, pre + name + suf)
234 try:
235 fd = _os.open(file, flags, 0600)
236 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000237 return (fd, _os.path.abspath(file))
Guido van Rossum0e548712002-08-09 16:14:33 +0000238 except OSError, e:
239 if e.errno == _errno.EEXIST:
240 continue # try again
241 raise
242
243 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():
Skip Montanaroea59a842008-04-27 22:49:56 +0000255 """Accessor for tempfile.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):
Skip Montanaroea59a842008-04-27 22:49:56 +0000267 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000268 file. The return value is a pair (fd, name) where fd is the
269 file descriptor returned by os.open, and name is the filename.
270
271 If 'suffix' is specified, the file name will end with that suffix,
272 otherwise there will be no suffix.
273
274 If 'prefix' is specified, the file name will begin with that prefix,
275 otherwise a default prefix is used.
276
277 If 'dir' is specified, the file will be created in that directory,
278 otherwise a default directory is used.
279
Tim Peters04490bf2002-08-14 15:41:26 +0000280 If 'text' is specified and true, the file is opened in text
281 mode. Else (the default) the file is opened in binary mode. On
282 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000283
284 The file is readable and writable only by the creating user ID.
285 If the operating system uses permission bits to indicate whether a
286 file is executable, the file is executable by no one. The file
287 descriptor is not inherited by children of this process.
288
289 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000290 """
291
Guido van Rossume888cdc2002-08-17 14:50:24 +0000292 if dir is None:
293 dir = gettempdir()
294
Tim Peters04490bf2002-08-14 15:41:26 +0000295 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000296 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000297 else:
298 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000299
300 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000301
Guido van Rossumeee94981991-11-12 15:38:08 +0000302
Guido van Rossume888cdc2002-08-17 14:50:24 +0000303def mkdtemp(suffix="", prefix=template, dir=None):
Skip Montanaroea59a842008-04-27 22:49:56 +0000304 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000305 directory. The return value is the pathname of the directory.
306
Tim Peters04490bf2002-08-14 15:41:26 +0000307 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000308 not accepted.
309
310 The directory is readable, writable, and searchable only by the
311 creating user.
312
313 Caller is responsible for deleting the directory when done with it.
314 """
315
Guido van Rossume888cdc2002-08-17 14:50:24 +0000316 if dir is None:
317 dir = gettempdir()
318
Guido van Rossum0e548712002-08-09 16:14:33 +0000319 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000320
Guido van Rossum0e548712002-08-09 16:14:33 +0000321 for seq in xrange(TMP_MAX):
322 name = names.next()
323 file = _os.path.join(dir, prefix + name + suffix)
324 try:
325 _os.mkdir(file, 0700)
326 return file
327 except OSError, e:
328 if e.errno == _errno.EEXIST:
329 continue # try again
330 raise
331
332 raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
333
Guido van Rossume888cdc2002-08-17 14:50:24 +0000334def mktemp(suffix="", prefix=template, dir=None):
Skip Montanaroea59a842008-04-27 22:49:56 +0000335 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000336 file is not created.
337
Tim Peters04490bf2002-08-14 15:41:26 +0000338 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000339 not accepted.
340
341 This function is unsafe and should not be used. The file name
342 refers to a file that did not exist at some point, but by the time
343 you get around to creating it, someone else may have beaten you to
344 the punch.
345 """
346
Guido van Rossum44f602d2002-11-22 15:56:29 +0000347## from warnings import warn as _warn
348## _warn("mktemp is a potential security risk to your program",
349## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000350
Guido van Rossume888cdc2002-08-17 14:50:24 +0000351 if dir is None:
352 dir = gettempdir()
353
Guido van Rossum0e548712002-08-09 16:14:33 +0000354 names = _get_candidate_names()
355 for seq in xrange(TMP_MAX):
356 name = names.next()
357 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000358 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000359 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000360
Guido van Rossum0e548712002-08-09 16:14:33 +0000361 raise IOError, (_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000362
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000363
Guido van Rossum0e548712002-08-09 16:14:33 +0000364class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000365 """Temporary file wrapper
366
Guido van Rossum0e548712002-08-09 16:14:33 +0000367 This class provides a wrapper around files opened for
368 temporary use. In particular, it seeks to automatically
369 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000370 """
Tim Petersa255a722001-12-18 22:32:40 +0000371
Georg Brandl35ef9c12007-03-13 18:31:49 +0000372 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000373 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000374 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000375 self.close_called = False
Georg Brandl35ef9c12007-03-13 18:31:49 +0000376 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000377
Guido van Rossumca549821997-08-12 18:00:12 +0000378 def __getattr__(self, name):
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000379 # Attribute lookups are delegated to the underlying file
380 # and cached for non-numeric results
381 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000382 file = self.__dict__['file']
383 a = getattr(file, name)
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000384 if not issubclass(type(a), type(0)):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000385 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000386 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000387
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000388 # The underlying __enter__ method returns the wrong object
389 # (self.file) so override it to return the wrapper
390 def __enter__(self):
391 self.file.__enter__()
392 return self
393
Guido van Rossum0e548712002-08-09 16:14:33 +0000394 # NT provides delete-on-close as a primitive, so we don't need
395 # the wrapper to do anything special. We still use it so that
396 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
397 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000398 # Cache the unlinker so we don't get spurious errors at
399 # shutdown when the module-level "os" is None'd out. Note
400 # that this must be referenced as self.unlink, because the
401 # name TemporaryFileWrapper may also get None'd out before
402 # __del__ is called.
403 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000404
Guido van Rossum0e548712002-08-09 16:14:33 +0000405 def close(self):
406 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000407 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000408 self.file.close()
Georg Brandl35ef9c12007-03-13 18:31:49 +0000409 if self.delete:
410 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000411
Guido van Rossum0e548712002-08-09 16:14:33 +0000412 def __del__(self):
413 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000414
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000415 # Need to trap __exit__ as well to ensure the file gets
416 # deleted when used in a with statement
417 def __exit__(self, exc, value, tb):
418 result = self.file.__exit__(exc, value, tb)
419 self.close()
420 return result
Benjamin Peterson31f42ab2009-06-30 22:14:33 +0000421 else:
422 def __exit__(self, exc, value, tb):
Benjamin Peterson4f247672009-07-01 13:34:35 +0000423 self.file.__exit__(exc, value, tb)
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000424
425
Guido van Rossum0e548712002-08-09 16:14:33 +0000426def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
Georg Brandl35ef9c12007-03-13 18:31:49 +0000427 prefix=template, 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.
431 'mode' -- the mode argument to os.fdopen (default "w+b").
432 'bufsize' -- the buffer size argument to os.fdopen (default -1).
Georg Brandl35ef9c12007-03-13 18:31:49 +0000433 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000434 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000435
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000436 Returns an object with a file-like interface; the name of the file
437 is accessible as file.name. The file will be automatically deleted
Georg Brandl35ef9c12007-03-13 18:31:49 +0000438 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000439 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000440
Guido van Rossume888cdc2002-08-17 14:50:24 +0000441 if dir is None:
442 dir = gettempdir()
443
Tim Petersc21ea742002-08-13 23:36:01 +0000444 if 'b' in mode:
445 flags = _bin_openflags
446 else:
447 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000448
Guido van Rossum0e548712002-08-09 16:14:33 +0000449 # Setting O_TEMPORARY in the flags causes the OS to delete
450 # the file when it is closed. This is only supported by Windows.
Georg Brandl35ef9c12007-03-13 18:31:49 +0000451 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000452 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000453
Guido van Rossum0e548712002-08-09 16:14:33 +0000454 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
455 file = _os.fdopen(fd, mode, bufsize)
Georg Brandl35ef9c12007-03-13 18:31:49 +0000456 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000457
Jason Tishler80c02af2002-08-14 15:10:09 +0000458if _os.name != 'posix' or _os.sys.platform == 'cygwin':
459 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
460 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000461 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000462
463else:
Guido van Rossum0e548712002-08-09 16:14:33 +0000464 def TemporaryFile(mode='w+b', bufsize=-1, suffix="",
Guido van Rossume888cdc2002-08-17 14:50:24 +0000465 prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000466 """Create and return a temporary file.
467 Arguments:
Neal Norwitz946aea22006-06-16 04:31:06 +0000468 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossum0e548712002-08-09 16:14:33 +0000469 'mode' -- the mode argument to os.fdopen (default "w+b").
470 'bufsize' -- the buffer size argument to os.fdopen (default -1).
471 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000472
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000473 Returns an object with a file-like interface. The file has no
474 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000475 """
476
Guido van Rossume888cdc2002-08-17 14:50:24 +0000477 if dir is None:
478 dir = gettempdir()
479
Tim Petersc21ea742002-08-13 23:36:01 +0000480 if 'b' in mode:
481 flags = _bin_openflags
482 else:
483 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000484
485 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
486 try:
487 _os.unlink(name)
488 return _os.fdopen(fd, mode, bufsize)
489 except:
490 _os.close(fd)
491 raise
Collin Wintera8785cc2007-03-19 18:52:08 +0000492
493class SpooledTemporaryFile:
494 """Temporary file wrapper, specialized to switch from
495 StringIO to a real file when it exceeds a certain size or
496 when a fileno is needed.
497 """
498 _rolled = False
499
500 def __init__(self, max_size=0, mode='w+b', bufsize=-1,
501 suffix="", prefix=template, dir=None):
502 self._file = _StringIO()
503 self._max_size = max_size
504 self._rolled = False
505 self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir)
506
507 def _check(self, file):
508 if self._rolled: return
509 max_size = self._max_size
510 if max_size and file.tell() > max_size:
511 self.rollover()
512
513 def rollover(self):
514 if self._rolled: return
515 file = self._file
516 newfile = self._file = TemporaryFile(*self._TemporaryFileArgs)
517 del self._TemporaryFileArgs
518
519 newfile.write(file.getvalue())
520 newfile.seek(file.tell(), 0)
521
522 self._rolled = True
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000523
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000524 # The method caching trick from NamedTemporaryFile
525 # won't work here, because _file may change from a
526 # _StringIO instance to a real file. So we list
527 # all the methods directly.
528
529 # Context management protocol
530 def __enter__(self):
531 if self._file.closed:
532 raise ValueError("Cannot enter context with closed file")
533 return self
534
535 def __exit__(self, exc, value, tb):
536 self._file.close()
537
Collin Wintera8785cc2007-03-19 18:52:08 +0000538 # file protocol
539 def __iter__(self):
540 return self._file.__iter__()
541
542 def close(self):
543 self._file.close()
544
545 @property
546 def closed(self):
547 return self._file.closed
548
549 @property
550 def encoding(self):
551 return self._file.encoding
552
553 def fileno(self):
554 self.rollover()
555 return self._file.fileno()
556
557 def flush(self):
558 self._file.flush()
559
560 def isatty(self):
561 return self._file.isatty()
562
563 @property
564 def mode(self):
565 return self._file.mode
566
567 @property
568 def name(self):
569 return self._file.name
570
571 @property
572 def newlines(self):
573 return self._file.newlines
574
575 def next(self):
576 return self._file.next
577
578 def read(self, *args):
579 return self._file.read(*args)
580
581 def readline(self, *args):
582 return self._file.readline(*args)
583
584 def readlines(self, *args):
585 return self._file.readlines(*args)
586
587 def seek(self, *args):
588 self._file.seek(*args)
589
590 @property
591 def softspace(self):
592 return self._file.softspace
593
594 def tell(self):
595 return self._file.tell()
596
597 def truncate(self):
598 self._file.truncate()
599
600 def write(self, s):
601 file = self._file
602 rv = file.write(s)
603 self._check(file)
604 return rv
605
606 def writelines(self, iterable):
607 file = self._file
608 rv = file.writelines(iterable)
609 self._check(file)
610 return rv
611
612 def xreadlines(self, *args):
613 return self._file.xreadlines(*args)