blob: 2dfc6095cb1538d0be20b0c4fe4e95d16c7e01a7 [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
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:
Guido van Rossum0e548712002-08-09 16:14:33 +0000208 if e[0] != _errno.EEXIST:
209 break # no point trying more names in this directory
210 pass
211 raise IOError, (_errno.ENOENT,
212 ("No usable temporary directory found in %s" % dirlist))
213
Guido van Rossume888cdc2002-08-17 14:50:24 +0000214_name_sequence = None
215
Guido van Rossum0e548712002-08-09 16:14:33 +0000216def _get_candidate_names():
217 """Common setup sequence for all user-callable interfaces."""
218
Guido van Rossume888cdc2002-08-17 14:50:24 +0000219 global _name_sequence
220 if _name_sequence is None:
221 _once_lock.acquire()
222 try:
223 if _name_sequence is None:
224 _name_sequence = _RandomNameSequence()
225 finally:
226 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000227 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000228
229
Guido van Rossum0e548712002-08-09 16:14:33 +0000230def _mkstemp_inner(dir, pre, suf, flags):
231 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000232
Guido van Rossum0e548712002-08-09 16:14:33 +0000233 names = _get_candidate_names()
234
235 for seq in xrange(TMP_MAX):
236 name = names.next()
237 file = _os.path.join(dir, pre + name + suf)
238 try:
239 fd = _os.open(file, flags, 0600)
240 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000241 return (fd, _os.path.abspath(file))
Guido van Rossum0e548712002-08-09 16:14:33 +0000242 except OSError, e:
243 if e.errno == _errno.EEXIST:
244 continue # try again
245 raise
246
247 raise IOError, (_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000248
Guido van Rossum0e548712002-08-09 16:14:33 +0000249
250# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000251
Guido van Rossum41f95031992-03-31 19:02:01 +0000252def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000253 """Accessor for tempdir.template."""
254 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000255
Guido van Rossume888cdc2002-08-17 14:50:24 +0000256tempdir = None
257
Guido van Rossum0e548712002-08-09 16:14:33 +0000258def gettempdir():
Skip Montanaroea59a842008-04-27 22:49:56 +0000259 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000260 global tempdir
261 if tempdir is None:
262 _once_lock.acquire()
263 try:
264 if tempdir is None:
265 tempdir = _get_default_tempdir()
266 finally:
267 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000268 return tempdir
269
Guido van Rossume888cdc2002-08-17 14:50:24 +0000270def mkstemp(suffix="", prefix=template, dir=None, text=False):
Skip Montanaroea59a842008-04-27 22:49:56 +0000271 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000272 file. The return value is a pair (fd, name) where fd is the
273 file descriptor returned by os.open, and name is the filename.
274
275 If 'suffix' is specified, the file name will end with that suffix,
276 otherwise there will be no suffix.
277
278 If 'prefix' is specified, the file name will begin with that prefix,
279 otherwise a default prefix is used.
280
281 If 'dir' is specified, the file will be created in that directory,
282 otherwise a default directory is used.
283
Tim Peters04490bf2002-08-14 15:41:26 +0000284 If 'text' is specified and true, the file is opened in text
285 mode. Else (the default) the file is opened in binary mode. On
286 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000287
288 The file is readable and writable only by the creating user ID.
289 If the operating system uses permission bits to indicate whether a
290 file is executable, the file is executable by no one. The file
291 descriptor is not inherited by children of this process.
292
293 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000294 """
295
Guido van Rossume888cdc2002-08-17 14:50:24 +0000296 if dir is None:
297 dir = gettempdir()
298
Tim Peters04490bf2002-08-14 15:41:26 +0000299 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000300 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000301 else:
302 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000303
304 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000305
Guido van Rossumeee94981991-11-12 15:38:08 +0000306
Guido van Rossume888cdc2002-08-17 14:50:24 +0000307def mkdtemp(suffix="", prefix=template, dir=None):
Skip Montanaroea59a842008-04-27 22:49:56 +0000308 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000309 directory. The return value is the pathname of the directory.
310
Tim Peters04490bf2002-08-14 15:41:26 +0000311 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000312 not accepted.
313
314 The directory is readable, writable, and searchable only by the
315 creating user.
316
317 Caller is responsible for deleting the directory when done with it.
318 """
319
Guido van Rossume888cdc2002-08-17 14:50:24 +0000320 if dir is None:
321 dir = gettempdir()
322
Guido van Rossum0e548712002-08-09 16:14:33 +0000323 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000324
Guido van Rossum0e548712002-08-09 16:14:33 +0000325 for seq in xrange(TMP_MAX):
326 name = names.next()
327 file = _os.path.join(dir, prefix + name + suffix)
328 try:
329 _os.mkdir(file, 0700)
330 return file
331 except OSError, e:
332 if e.errno == _errno.EEXIST:
333 continue # try again
334 raise
335
336 raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
337
Guido van Rossume888cdc2002-08-17 14:50:24 +0000338def mktemp(suffix="", prefix=template, dir=None):
Skip Montanaroea59a842008-04-27 22:49:56 +0000339 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000340 file is not created.
341
Tim Peters04490bf2002-08-14 15:41:26 +0000342 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000343 not accepted.
344
345 This function is unsafe and should not be used. The file name
346 refers to a file that did not exist at some point, but by the time
347 you get around to creating it, someone else may have beaten you to
348 the punch.
349 """
350
Guido van Rossum44f602d2002-11-22 15:56:29 +0000351## from warnings import warn as _warn
352## _warn("mktemp is a potential security risk to your program",
353## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000354
Guido van Rossume888cdc2002-08-17 14:50:24 +0000355 if dir is None:
356 dir = gettempdir()
357
Guido van Rossum0e548712002-08-09 16:14:33 +0000358 names = _get_candidate_names()
359 for seq in xrange(TMP_MAX):
360 name = names.next()
361 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000362 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000363 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000364
Guido van Rossum0e548712002-08-09 16:14:33 +0000365 raise IOError, (_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000366
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000367
Guido van Rossum0e548712002-08-09 16:14:33 +0000368class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000369 """Temporary file wrapper
370
Guido van Rossum0e548712002-08-09 16:14:33 +0000371 This class provides a wrapper around files opened for
372 temporary use. In particular, it seeks to automatically
373 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000374 """
Tim Petersa255a722001-12-18 22:32:40 +0000375
Georg Brandl35ef9c12007-03-13 18:31:49 +0000376 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000377 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000378 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000379 self.close_called = False
Georg Brandl35ef9c12007-03-13 18:31:49 +0000380 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000381
Guido van Rossumca549821997-08-12 18:00:12 +0000382 def __getattr__(self, name):
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000383 # Attribute lookups are delegated to the underlying file
384 # and cached for non-numeric results
385 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000386 file = self.__dict__['file']
387 a = getattr(file, name)
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000388 if not issubclass(type(a), type(0)):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000389 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000390 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000391
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000392 # The underlying __enter__ method returns the wrong object
393 # (self.file) so override it to return the wrapper
394 def __enter__(self):
395 self.file.__enter__()
396 return self
397
Guido van Rossum0e548712002-08-09 16:14:33 +0000398 # NT provides delete-on-close as a primitive, so we don't need
399 # the wrapper to do anything special. We still use it so that
400 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
401 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000402 # Cache the unlinker so we don't get spurious errors at
403 # shutdown when the module-level "os" is None'd out. Note
404 # that this must be referenced as self.unlink, because the
405 # name TemporaryFileWrapper may also get None'd out before
406 # __del__ is called.
407 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000408
Guido van Rossum0e548712002-08-09 16:14:33 +0000409 def close(self):
410 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000411 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000412 self.file.close()
Georg Brandl35ef9c12007-03-13 18:31:49 +0000413 if self.delete:
414 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000415
Guido van Rossum0e548712002-08-09 16:14:33 +0000416 def __del__(self):
417 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000418
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000419 # Need to trap __exit__ as well to ensure the file gets
420 # deleted when used in a with statement
421 def __exit__(self, exc, value, tb):
422 result = self.file.__exit__(exc, value, tb)
423 self.close()
424 return result
Benjamin Peterson31f42ab2009-06-30 22:14:33 +0000425 else:
426 def __exit__(self, exc, value, tb):
Benjamin Peterson4f247672009-07-01 13:34:35 +0000427 self.file.__exit__(exc, value, tb)
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000428
429
Guido van Rossum0e548712002-08-09 16:14:33 +0000430def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
Georg Brandl35ef9c12007-03-13 18:31:49 +0000431 prefix=template, dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000432 """Create and return a temporary file.
433 Arguments:
434 'prefix', 'suffix', 'dir' -- as for mkstemp.
435 'mode' -- the mode argument to os.fdopen (default "w+b").
436 'bufsize' -- the buffer size argument to os.fdopen (default -1).
Georg Brandl35ef9c12007-03-13 18:31:49 +0000437 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000438 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000439
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000440 Returns an object with a file-like interface; the name of the file
441 is accessible as file.name. The file will be automatically deleted
Georg Brandl35ef9c12007-03-13 18:31:49 +0000442 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000443 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000444
Guido van Rossume888cdc2002-08-17 14:50:24 +0000445 if dir is None:
446 dir = gettempdir()
447
Tim Petersc21ea742002-08-13 23:36:01 +0000448 if 'b' in mode:
449 flags = _bin_openflags
450 else:
451 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000452
Guido van Rossum0e548712002-08-09 16:14:33 +0000453 # Setting O_TEMPORARY in the flags causes the OS to delete
454 # the file when it is closed. This is only supported by Windows.
Georg Brandl35ef9c12007-03-13 18:31:49 +0000455 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000457
Guido van Rossum0e548712002-08-09 16:14:33 +0000458 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
459 file = _os.fdopen(fd, mode, bufsize)
Georg Brandl35ef9c12007-03-13 18:31:49 +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 Rossum0e548712002-08-09 16:14:33 +0000468 def TemporaryFile(mode='w+b', bufsize=-1, suffix="",
Guido van Rossume888cdc2002-08-17 14:50:24 +0000469 prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000470 """Create and return a temporary file.
471 Arguments:
Neal Norwitz946aea22006-06-16 04:31:06 +0000472 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossum0e548712002-08-09 16:14:33 +0000473 'mode' -- the mode argument to os.fdopen (default "w+b").
474 'bufsize' -- the buffer size argument to os.fdopen (default -1).
475 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000476
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000477 Returns an object with a file-like interface. The file has no
478 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000479 """
480
Guido van Rossume888cdc2002-08-17 14:50:24 +0000481 if dir is None:
482 dir = gettempdir()
483
Tim Petersc21ea742002-08-13 23:36:01 +0000484 if 'b' in mode:
485 flags = _bin_openflags
486 else:
487 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000488
489 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
490 try:
491 _os.unlink(name)
492 return _os.fdopen(fd, mode, bufsize)
493 except:
494 _os.close(fd)
495 raise
Collin Wintera8785cc2007-03-19 18:52:08 +0000496
497class SpooledTemporaryFile:
498 """Temporary file wrapper, specialized to switch from
499 StringIO to a real file when it exceeds a certain size or
500 when a fileno is needed.
501 """
502 _rolled = False
503
504 def __init__(self, max_size=0, mode='w+b', bufsize=-1,
505 suffix="", prefix=template, dir=None):
506 self._file = _StringIO()
507 self._max_size = max_size
508 self._rolled = False
509 self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir)
510
511 def _check(self, file):
512 if self._rolled: return
513 max_size = self._max_size
514 if max_size and file.tell() > max_size:
515 self.rollover()
516
517 def rollover(self):
518 if self._rolled: return
519 file = self._file
520 newfile = self._file = TemporaryFile(*self._TemporaryFileArgs)
521 del self._TemporaryFileArgs
522
523 newfile.write(file.getvalue())
524 newfile.seek(file.tell(), 0)
525
526 self._rolled = True
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000527
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000528 # The method caching trick from NamedTemporaryFile
529 # won't work here, because _file may change from a
530 # _StringIO instance to a real file. So we list
531 # all the methods directly.
532
533 # Context management protocol
534 def __enter__(self):
535 if self._file.closed:
536 raise ValueError("Cannot enter context with closed file")
537 return self
538
539 def __exit__(self, exc, value, tb):
540 self._file.close()
541
Collin Wintera8785cc2007-03-19 18:52:08 +0000542 # file protocol
543 def __iter__(self):
544 return self._file.__iter__()
545
546 def close(self):
547 self._file.close()
548
549 @property
550 def closed(self):
551 return self._file.closed
552
Collin Wintera8785cc2007-03-19 18:52:08 +0000553 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):
Serhiy Storchakabeaa3ad2013-02-09 12:20:18 +0200565 try:
566 return self._file.mode
567 except AttributeError:
568 return self._TemporaryFileArgs[0]
Collin Wintera8785cc2007-03-19 18:52:08 +0000569
570 @property
571 def name(self):
Serhiy Storchakabeaa3ad2013-02-09 12:20:18 +0200572 try:
573 return self._file.name
574 except AttributeError:
575 return None
Collin Wintera8785cc2007-03-19 18:52:08 +0000576
577 def next(self):
578 return self._file.next
579
580 def read(self, *args):
581 return self._file.read(*args)
582
583 def readline(self, *args):
584 return self._file.readline(*args)
585
586 def readlines(self, *args):
587 return self._file.readlines(*args)
588
589 def seek(self, *args):
590 self._file.seek(*args)
591
592 @property
593 def softspace(self):
594 return self._file.softspace
595
596 def tell(self):
597 return self._file.tell()
598
599 def truncate(self):
600 self._file.truncate()
601
602 def write(self, s):
603 file = self._file
604 rv = file.write(s)
605 self._check(file)
606 return rv
607
608 def writelines(self, iterable):
609 file = self._file
610 rv = file.writelines(iterable)
611 self._check(file)
612 return rv
613
614 def xreadlines(self, *args):
Serhiy Storchakabeaa3ad2013-02-09 12:20:18 +0200615 try:
616 return self._file.xreadlines(*args)
617 except AttributeError:
618 return iter(self._file.readlines(*args))