blob: 84ec6e07f4c3f583d4e56e0ce51b890e2550cd13 [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
36if _os.name == 'mac':
Jack Jansenbb829b72003-03-21 12:55:38 +000037 import Carbon.Folder as _Folder
38 import Carbon.Folders as _Folders
Guido van Rossum0e548712002-08-09 16:14:33 +000039
40try:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000041 from cStringIO import StringIO as _StringIO
Skip Montanaroea59a842008-04-27 22:49:56 +000042except ImportError:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000043 from StringIO import StringIO as _StringIO
Collin Wintera8785cc2007-03-19 18:52:08 +000044
45try:
Guido van Rossum0e548712002-08-09 16:14:33 +000046 import fcntl as _fcntl
Tim Peters90ee7eb2004-07-18 23:58:17 +000047except ImportError:
Tim Peters291f14e2003-07-22 02:50:01 +000048 def _set_cloexec(fd):
49 pass
50else:
Guido van Rossum0e548712002-08-09 16:14:33 +000051 def _set_cloexec(fd):
Tim Peters90ee7eb2004-07-18 23:58:17 +000052 try:
53 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
54 except IOError:
55 pass
Alex Martellif09994e2003-11-09 16:44:09 +000056 else:
Guido van Rossum0e548712002-08-09 16:14:33 +000057 # flags read successfully, modify
58 flags |= _fcntl.FD_CLOEXEC
59 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
Tim Peters291f14e2003-07-22 02:50:01 +000060
Guido van Rossum0e548712002-08-09 16:14:33 +000061
62try:
63 import thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000064except ImportError:
65 import dummy_thread as _thread
66_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000067
68_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000069if hasattr(_os, 'O_NOINHERIT'):
70 _text_openflags |= _os.O_NOINHERIT
71if hasattr(_os, 'O_NOFOLLOW'):
72 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000073
74_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000075if hasattr(_os, 'O_BINARY'):
76 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000077
78if hasattr(_os, 'TMP_MAX'):
79 TMP_MAX = _os.TMP_MAX
80else:
81 TMP_MAX = 10000
82
Tim Petersbd7b4c72002-08-13 23:33:56 +000083template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000084
Guido van Rossum0e548712002-08-09 16:14:33 +000085# Internal routines.
86
87_once_lock = _allocate_lock()
88
Guido van Rossumb256159392003-11-10 02:16:36 +000089if hasattr(_os, "lstat"):
90 _stat = _os.lstat
91elif hasattr(_os, "stat"):
92 _stat = _os.stat
93else:
94 # Fallback. All we need is something that raises os.error if the
95 # file doesn't exist.
96 def _stat(fn):
97 try:
98 f = open(fn)
99 except IOError:
100 raise _os.error
101 f.close()
102
103def _exists(fn):
104 try:
105 _stat(fn)
106 except _os.error:
107 return False
108 else:
109 return True
110
Guido van Rossum0e548712002-08-09 16:14:33 +0000111class _RandomNameSequence:
112 """An instance of _RandomNameSequence generates an endless
113 sequence of unpredictable strings which can safely be incorporated
114 into file names. Each string is six characters long. Multiple
115 threads can safely use the same instance at the same time.
116
117 _RandomNameSequence is an iterator."""
118
Tim Peters97701b52002-11-21 15:59:59 +0000119 characters = ("abcdefghijklmnopqrstuvwxyz" +
120 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
Collin Winter9b2a1092007-03-08 22:16:25 +0000121 "0123456789_")
Guido van Rossum0e548712002-08-09 16:14:33 +0000122
123 def __init__(self):
124 self.mutex = _allocate_lock()
125 self.rng = _Random()
126 self.normcase = _os.path.normcase
Tim Peters97701b52002-11-21 15:59:59 +0000127
Guido van Rossum0e548712002-08-09 16:14:33 +0000128 def __iter__(self):
129 return self
130
131 def next(self):
132 m = self.mutex
133 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000134 choose = self.rng.choice
Guido van Rossum0e548712002-08-09 16:14:33 +0000135
Tim Peters97701b52002-11-21 15:59:59 +0000136 m.acquire()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000137 try:
Tim Peters97701b52002-11-21 15:59:59 +0000138 letters = [choose(c) for dummy in "123456"]
Guido van Rossum0e548712002-08-09 16:14:33 +0000139 finally:
140 m.release()
141
Tim Peters97701b52002-11-21 15:59:59 +0000142 return self.normcase(''.join(letters))
Guido van Rossum0e548712002-08-09 16:14:33 +0000143
144def _candidate_tempdir_list():
145 """Generate a list of candidate temporary directories which
146 _get_default_tempdir will try."""
147
148 dirlist = []
149
150 # First, try the environment.
151 for envname in 'TMPDIR', 'TEMP', 'TMP':
152 dirname = _os.getenv(envname)
153 if dirname: dirlist.append(dirname)
154
155 # Failing that, try OS-specific locations.
156 if _os.name == 'mac':
157 try:
Jack Jansenbb829b72003-03-21 12:55:38 +0000158 fsr = _Folder.FSFindFolder(_Folders.kOnSystemDisk,
159 _Folders.kTemporaryFolderType, 1)
160 dirname = fsr.as_pathname()
Guido van Rossum0e548712002-08-09 16:14:33 +0000161 dirlist.append(dirname)
Jack Jansenbb829b72003-03-21 12:55:38 +0000162 except _Folder.error:
Guido van Rossum0e548712002-08-09 16:14:33 +0000163 pass
164 elif _os.name == 'riscos':
165 dirname = _os.getenv('Wimp$ScrapDir')
166 if dirname: dirlist.append(dirname)
167 elif _os.name == 'nt':
168 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
169 else:
170 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
171
172 # As a last resort, the current directory.
173 try:
174 dirlist.append(_os.getcwd())
175 except (AttributeError, _os.error):
176 dirlist.append(_os.curdir)
177
178 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000179
Guido van Rossum0e548712002-08-09 16:14:33 +0000180def _get_default_tempdir():
181 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000182 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000183
184 We determine whether or not a candidate temp dir is usable by
185 trying to create and write to a file in that directory. If this
186 is successful, the test file is deleted. To prevent denial of
187 service, the name of the test file must be randomized."""
188
189 namer = _RandomNameSequence()
190 dirlist = _candidate_tempdir_list()
191 flags = _text_openflags
192
193 for dir in dirlist:
194 if dir != _os.curdir:
195 dir = _os.path.normcase(_os.path.abspath(dir))
196 # Try only a few names per directory.
197 for seq in xrange(100):
198 name = namer.next()
199 filename = _os.path.join(dir, name)
200 try:
201 fd = _os.open(filename, flags, 0600)
202 fp = _os.fdopen(fd, 'w')
Tim Petersb90f89a2001-01-15 03:26:36 +0000203 fp.write('blat')
204 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000205 _os.unlink(filename)
206 del fp, fd
207 return dir
208 except (OSError, IOError), e:
209 if e[0] != _errno.EEXIST:
210 break # no point trying more names in this directory
211 pass
212 raise IOError, (_errno.ENOENT,
213 ("No usable temporary directory found in %s" % dirlist))
214
Guido van Rossume888cdc2002-08-17 14:50:24 +0000215_name_sequence = None
216
Guido van Rossum0e548712002-08-09 16:14:33 +0000217def _get_candidate_names():
218 """Common setup sequence for all user-callable interfaces."""
219
Guido van Rossume888cdc2002-08-17 14:50:24 +0000220 global _name_sequence
221 if _name_sequence is None:
222 _once_lock.acquire()
223 try:
224 if _name_sequence is None:
225 _name_sequence = _RandomNameSequence()
226 finally:
227 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000228 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000229
230
Guido van Rossum0e548712002-08-09 16:14:33 +0000231def _mkstemp_inner(dir, pre, suf, flags):
232 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000233
Guido van Rossum0e548712002-08-09 16:14:33 +0000234 names = _get_candidate_names()
235
236 for seq in xrange(TMP_MAX):
237 name = names.next()
238 file = _os.path.join(dir, pre + name + suf)
239 try:
240 fd = _os.open(file, flags, 0600)
241 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000242 return (fd, _os.path.abspath(file))
Guido van Rossum0e548712002-08-09 16:14:33 +0000243 except OSError, e:
244 if e.errno == _errno.EEXIST:
245 continue # try again
246 raise
247
248 raise IOError, (_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000249
Guido van Rossum0e548712002-08-09 16:14:33 +0000250
251# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000252
Guido van Rossum41f95031992-03-31 19:02:01 +0000253def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000254 """Accessor for tempdir.template."""
255 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000256
Guido van Rossume888cdc2002-08-17 14:50:24 +0000257tempdir = None
258
Guido van Rossum0e548712002-08-09 16:14:33 +0000259def gettempdir():
Skip Montanaroea59a842008-04-27 22:49:56 +0000260 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000261 global tempdir
262 if tempdir is None:
263 _once_lock.acquire()
264 try:
265 if tempdir is None:
266 tempdir = _get_default_tempdir()
267 finally:
268 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000269 return tempdir
270
Guido van Rossume888cdc2002-08-17 14:50:24 +0000271def mkstemp(suffix="", prefix=template, dir=None, text=False):
Skip Montanaroea59a842008-04-27 22:49:56 +0000272 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000273 file. The return value is a pair (fd, name) where fd is the
274 file descriptor returned by os.open, and name is the filename.
275
276 If 'suffix' is specified, the file name will end with that suffix,
277 otherwise there will be no suffix.
278
279 If 'prefix' is specified, the file name will begin with that prefix,
280 otherwise a default prefix is used.
281
282 If 'dir' is specified, the file will be created in that directory,
283 otherwise a default directory is used.
284
Tim Peters04490bf2002-08-14 15:41:26 +0000285 If 'text' is specified and true, the file is opened in text
286 mode. Else (the default) the file is opened in binary mode. On
287 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000288
289 The file is readable and writable only by the creating user ID.
290 If the operating system uses permission bits to indicate whether a
291 file is executable, the file is executable by no one. The file
292 descriptor is not inherited by children of this process.
293
294 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000295 """
296
Guido van Rossume888cdc2002-08-17 14:50:24 +0000297 if dir is None:
298 dir = gettempdir()
299
Tim Peters04490bf2002-08-14 15:41:26 +0000300 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000301 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000302 else:
303 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000304
305 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000306
Guido van Rossumeee94981991-11-12 15:38:08 +0000307
Guido van Rossume888cdc2002-08-17 14:50:24 +0000308def mkdtemp(suffix="", prefix=template, dir=None):
Skip Montanaroea59a842008-04-27 22:49:56 +0000309 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000310 directory. The return value is the pathname of the directory.
311
Tim Peters04490bf2002-08-14 15:41:26 +0000312 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000313 not accepted.
314
315 The directory is readable, writable, and searchable only by the
316 creating user.
317
318 Caller is responsible for deleting the directory when done with it.
319 """
320
Guido van Rossume888cdc2002-08-17 14:50:24 +0000321 if dir is None:
322 dir = gettempdir()
323
Guido van Rossum0e548712002-08-09 16:14:33 +0000324 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000325
Guido van Rossum0e548712002-08-09 16:14:33 +0000326 for seq in xrange(TMP_MAX):
327 name = names.next()
328 file = _os.path.join(dir, prefix + name + suffix)
329 try:
330 _os.mkdir(file, 0700)
331 return file
332 except OSError, e:
333 if e.errno == _errno.EEXIST:
334 continue # try again
335 raise
336
337 raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
338
Guido van Rossume888cdc2002-08-17 14:50:24 +0000339def mktemp(suffix="", prefix=template, dir=None):
Skip Montanaroea59a842008-04-27 22:49:56 +0000340 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000341 file is not created.
342
Tim Peters04490bf2002-08-14 15:41:26 +0000343 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000344 not accepted.
345
346 This function is unsafe and should not be used. The file name
347 refers to a file that did not exist at some point, but by the time
348 you get around to creating it, someone else may have beaten you to
349 the punch.
350 """
351
Guido van Rossum44f602d2002-11-22 15:56:29 +0000352## from warnings import warn as _warn
353## _warn("mktemp is a potential security risk to your program",
354## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000355
Guido van Rossume888cdc2002-08-17 14:50:24 +0000356 if dir is None:
357 dir = gettempdir()
358
Guido van Rossum0e548712002-08-09 16:14:33 +0000359 names = _get_candidate_names()
360 for seq in xrange(TMP_MAX):
361 name = names.next()
362 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000363 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000364 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000365
Guido van Rossum0e548712002-08-09 16:14:33 +0000366 raise IOError, (_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000367
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000368
Guido van Rossum0e548712002-08-09 16:14:33 +0000369class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000370 """Temporary file wrapper
371
Guido van Rossum0e548712002-08-09 16:14:33 +0000372 This class provides a wrapper around files opened for
373 temporary use. In particular, it seeks to automatically
374 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000375 """
Tim Petersa255a722001-12-18 22:32:40 +0000376
Georg Brandl35ef9c12007-03-13 18:31:49 +0000377 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000378 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000379 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000380 self.close_called = False
Georg Brandl35ef9c12007-03-13 18:31:49 +0000381 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000382
Guido van Rossumca549821997-08-12 18:00:12 +0000383 def __getattr__(self, name):
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000384 # Attribute lookups are delegated to the underlying file
385 # and cached for non-numeric results
386 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000387 file = self.__dict__['file']
388 a = getattr(file, name)
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000389 if not issubclass(type(a), type(0)):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000390 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000391 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000392
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000393 # The underlying __enter__ method returns the wrong object
394 # (self.file) so override it to return the wrapper
395 def __enter__(self):
396 self.file.__enter__()
397 return self
398
Guido van Rossum0e548712002-08-09 16:14:33 +0000399 # NT provides delete-on-close as a primitive, so we don't need
400 # the wrapper to do anything special. We still use it so that
401 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
402 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000403 # Cache the unlinker so we don't get spurious errors at
404 # shutdown when the module-level "os" is None'd out. Note
405 # that this must be referenced as self.unlink, because the
406 # name TemporaryFileWrapper may also get None'd out before
407 # __del__ is called.
408 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000409
Guido van Rossum0e548712002-08-09 16:14:33 +0000410 def close(self):
411 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000412 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000413 self.file.close()
Georg Brandl35ef9c12007-03-13 18:31:49 +0000414 if self.delete:
415 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000416
Guido van Rossum0e548712002-08-09 16:14:33 +0000417 def __del__(self):
418 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000419
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000420 # Need to trap __exit__ as well to ensure the file gets
421 # deleted when used in a with statement
422 def __exit__(self, exc, value, tb):
423 result = self.file.__exit__(exc, value, tb)
424 self.close()
425 return result
426
427
Guido van Rossum0e548712002-08-09 16:14:33 +0000428def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
Georg Brandl35ef9c12007-03-13 18:31:49 +0000429 prefix=template, dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000430 """Create and return a temporary file.
431 Arguments:
432 'prefix', 'suffix', 'dir' -- as for mkstemp.
433 'mode' -- the mode argument to os.fdopen (default "w+b").
434 'bufsize' -- the buffer size argument to os.fdopen (default -1).
Georg Brandl35ef9c12007-03-13 18:31:49 +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
Georg Brandl35ef9c12007-03-13 18:31:49 +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.
Georg Brandl35ef9c12007-03-13 18:31:49 +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)
457 file = _os.fdopen(fd, mode, bufsize)
Georg Brandl35ef9c12007-03-13 18:31:49 +0000458 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000459
Jason Tishler80c02af2002-08-14 15:10:09 +0000460if _os.name != 'posix' or _os.sys.platform == 'cygwin':
461 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
462 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000463 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000464
465else:
Guido van Rossum0e548712002-08-09 16:14:33 +0000466 def TemporaryFile(mode='w+b', bufsize=-1, suffix="",
Guido van Rossume888cdc2002-08-17 14:50:24 +0000467 prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000468 """Create and return a temporary file.
469 Arguments:
Neal Norwitz946aea22006-06-16 04:31:06 +0000470 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossum0e548712002-08-09 16:14:33 +0000471 'mode' -- the mode argument to os.fdopen (default "w+b").
472 'bufsize' -- the buffer size argument to os.fdopen (default -1).
473 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000474
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000475 Returns an object with a file-like interface. The file has no
476 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000477 """
478
Guido van Rossume888cdc2002-08-17 14:50:24 +0000479 if dir is None:
480 dir = gettempdir()
481
Tim Petersc21ea742002-08-13 23:36:01 +0000482 if 'b' in mode:
483 flags = _bin_openflags
484 else:
485 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000486
487 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
488 try:
489 _os.unlink(name)
490 return _os.fdopen(fd, mode, bufsize)
491 except:
492 _os.close(fd)
493 raise
Collin Wintera8785cc2007-03-19 18:52:08 +0000494
495class SpooledTemporaryFile:
496 """Temporary file wrapper, specialized to switch from
497 StringIO to a real file when it exceeds a certain size or
498 when a fileno is needed.
499 """
500 _rolled = False
501
502 def __init__(self, max_size=0, mode='w+b', bufsize=-1,
503 suffix="", prefix=template, dir=None):
504 self._file = _StringIO()
505 self._max_size = max_size
506 self._rolled = False
507 self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir)
508
509 def _check(self, file):
510 if self._rolled: return
511 max_size = self._max_size
512 if max_size and file.tell() > max_size:
513 self.rollover()
514
515 def rollover(self):
516 if self._rolled: return
517 file = self._file
518 newfile = self._file = TemporaryFile(*self._TemporaryFileArgs)
519 del self._TemporaryFileArgs
520
521 newfile.write(file.getvalue())
522 newfile.seek(file.tell(), 0)
523
524 self._rolled = True
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000525
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000526 # The method caching trick from NamedTemporaryFile
527 # won't work here, because _file may change from a
528 # _StringIO instance to a real file. So we list
529 # all the methods directly.
530
531 # Context management protocol
532 def __enter__(self):
533 if self._file.closed:
534 raise ValueError("Cannot enter context with closed file")
535 return self
536
537 def __exit__(self, exc, value, tb):
538 self._file.close()
539
Collin Wintera8785cc2007-03-19 18:52:08 +0000540 # file protocol
541 def __iter__(self):
542 return self._file.__iter__()
543
544 def close(self):
545 self._file.close()
546
547 @property
548 def closed(self):
549 return self._file.closed
550
551 @property
552 def encoding(self):
553 return self._file.encoding
554
555 def fileno(self):
556 self.rollover()
557 return self._file.fileno()
558
559 def flush(self):
560 self._file.flush()
561
562 def isatty(self):
563 return self._file.isatty()
564
565 @property
566 def mode(self):
567 return self._file.mode
568
569 @property
570 def name(self):
571 return self._file.name
572
573 @property
574 def newlines(self):
575 return self._file.newlines
576
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):
615 return self._file.xreadlines(*args)