blob: 109dc594bf42c7da39ca79c79f27e2fcc65f177e [file] [log] [blame]
Guido van Rossum0e548712002-08-09 16:14:33 +00001"""Temporary files.
Guido van Rossume7b146f2000-02-04 15:28:42 +00002
Guido van Rossum0e548712002-08-09 16:14:33 +00003This module provides generic, low- and high-level interfaces for
4creating temporary files and directories. The interfaces listed
5as "safe" just below can be used without fear of race conditions.
6Those listed as "unsafe" cannot, and are provided for backward
7compatibility only.
Guido van Rossumeee94981991-11-12 15:38:08 +00008
Guido van Rossum0e548712002-08-09 16:14:33 +00009This module also provides some data items to the user:
Guido van Rossumeee94981991-11-12 15:38:08 +000010
Guido van Rossum0e548712002-08-09 16:14:33 +000011 TMP_MAX - maximum number of names that will be tried before
12 giving up.
13 template - the default prefix for all temporary names.
14 You may change this to control the default prefix.
15 tempdir - If this is set to a string before the first use of
16 any routine from this module, it will be considered as
17 another candidate location to store temporary files.
18"""
Skip Montanaro40fc1602001-03-01 04:27:19 +000019
Guido van Rossum0e548712002-08-09 16:14:33 +000020__all__ = [
21 "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
Guido van Rossumd8faa362007-04-27 19:54:29 +000022 "SpooledTemporaryFile",
Guido van Rossum0e548712002-08-09 16:14:33 +000023 "mkstemp", "mkdtemp", # low level safe interfaces
24 "mktemp", # deprecated unsafe interface
25 "TMP_MAX", "gettempprefix", # constants
26 "tempdir", "gettempdir"
27 ]
Guido van Rossum41f95031992-03-31 19:02:01 +000028
Tim Peters4fd5a062002-01-28 23:11:23 +000029
Guido van Rossum0e548712002-08-09 16:14:33 +000030# Imports.
Tim Peters4fd5a062002-01-28 23:11:23 +000031
Guido van 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
Guido van Rossum68937b42007-05-18 00:51:22 +000040from io import StringIO as _StringIO
Guido van Rossumd8faa362007-04-27 19:54:29 +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
82tempdir = None
83
84# Internal routines.
85
86_once_lock = _allocate_lock()
87
Guido van Rossumb256159392003-11-10 02:16:36 +000088if hasattr(_os, "lstat"):
89 _stat = _os.lstat
90elif hasattr(_os, "stat"):
91 _stat = _os.stat
92else:
93 # Fallback. All we need is something that raises os.error if the
94 # file doesn't exist.
95 def _stat(fn):
96 try:
97 f = open(fn)
98 except IOError:
99 raise _os.error
100 f.close()
101
102def _exists(fn):
103 try:
104 _stat(fn)
105 except _os.error:
106 return False
107 else:
108 return True
109
Guido van Rossum0e548712002-08-09 16:14:33 +0000110class _RandomNameSequence:
111 """An instance of _RandomNameSequence generates an endless
112 sequence of unpredictable strings which can safely be incorporated
113 into file names. Each string is six characters long. Multiple
114 threads can safely use the same instance at the same time.
115
116 _RandomNameSequence is an iterator."""
117
Tim Peters97701b52002-11-21 15:59:59 +0000118 characters = ("abcdefghijklmnopqrstuvwxyz" +
119 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
Guido van Rossumd8faa362007-04-27 19:54:29 +0000120 "0123456789_")
Guido van Rossum0e548712002-08-09 16:14:33 +0000121
122 def __init__(self):
123 self.mutex = _allocate_lock()
124 self.rng = _Random()
125 self.normcase = _os.path.normcase
Tim Peters97701b52002-11-21 15:59:59 +0000126
Guido van Rossum0e548712002-08-09 16:14:33 +0000127 def __iter__(self):
128 return self
129
Georg Brandla18af4e2007-04-21 15:47:16 +0000130 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000131 m = self.mutex
132 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000133 choose = self.rng.choice
Guido van Rossum0e548712002-08-09 16:14:33 +0000134
Tim Peters97701b52002-11-21 15:59:59 +0000135 m.acquire()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000136 try:
Tim Peters97701b52002-11-21 15:59:59 +0000137 letters = [choose(c) for dummy in "123456"]
Guido van Rossum0e548712002-08-09 16:14:33 +0000138 finally:
139 m.release()
140
Tim Peters97701b52002-11-21 15:59:59 +0000141 return self.normcase(''.join(letters))
Guido van Rossum0e548712002-08-09 16:14:33 +0000142
143def _candidate_tempdir_list():
144 """Generate a list of candidate temporary directories which
145 _get_default_tempdir will try."""
146
147 dirlist = []
148
149 # First, try the environment.
150 for envname in 'TMPDIR', 'TEMP', 'TMP':
151 dirname = _os.getenv(envname)
152 if dirname: dirlist.append(dirname)
153
154 # Failing that, try OS-specific locations.
155 if _os.name == 'mac':
156 try:
Jack Jansenbb829b72003-03-21 12:55:38 +0000157 fsr = _Folder.FSFindFolder(_Folders.kOnSystemDisk,
158 _Folders.kTemporaryFolderType, 1)
159 dirname = fsr.as_pathname()
Guido van Rossum0e548712002-08-09 16:14:33 +0000160 dirlist.append(dirname)
Jack Jansenbb829b72003-03-21 12:55:38 +0000161 except _Folder.error:
Guido van Rossum0e548712002-08-09 16:14:33 +0000162 pass
163 elif _os.name == 'riscos':
164 dirname = _os.getenv('Wimp$ScrapDir')
165 if dirname: dirlist.append(dirname)
166 elif _os.name == 'nt':
167 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
168 else:
169 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
170
171 # As a last resort, the current directory.
172 try:
173 dirlist.append(_os.getcwd())
174 except (AttributeError, _os.error):
175 dirlist.append(_os.curdir)
176
177 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000178
Guido van Rossum0e548712002-08-09 16:14:33 +0000179def _get_default_tempdir():
180 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000181 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000182
183 We determine whether or not a candidate temp dir is usable by
184 trying to create and write to a file in that directory. If this
185 is successful, the test file is deleted. To prevent denial of
186 service, the name of the test file must be randomized."""
187
188 namer = _RandomNameSequence()
189 dirlist = _candidate_tempdir_list()
190 flags = _text_openflags
191
192 for dir in dirlist:
193 if dir != _os.curdir:
194 dir = _os.path.normcase(_os.path.abspath(dir))
195 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000196 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000197 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000198 filename = _os.path.join(dir, name)
199 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000200 fd = _os.open(filename, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000201 fp = _os.fdopen(fd, 'w')
Tim Petersb90f89a2001-01-15 03:26:36 +0000202 fp.write('blat')
203 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000204 _os.unlink(filename)
205 del fp, fd
206 return dir
Guido van Rossumb940e112007-01-10 16:19:56 +0000207 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
Guido van Rossum805365e2007-05-07 22:24:25 +0000235 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000236 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000237 file = _os.path.join(dir, pre + name + suf)
238 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000239 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000240 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000241 return (fd, _os.path.abspath(file))
Guido van Rossumb940e112007-01-10 16:19:56 +0000242 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000243 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():
259 """Accessor for tempdir.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):
Tim Peters04490bf2002-08-14 15:41:26 +0000271 """mkstemp([suffix, [prefix, [dir, [text]]]])
Guido van Rossum0e548712002-08-09 16:14:33 +0000272 User-callable function to create and return a unique temporary
273 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):
Guido van Rossum0e548712002-08-09 16:14:33 +0000309 """mkdtemp([suffix, [prefix, [dir]]])
310 User-callable function to create and return a unique temporary
311 directory. The return value is the pathname of the directory.
312
Tim Peters04490bf2002-08-14 15:41:26 +0000313 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000314 not accepted.
315
316 The directory is readable, writable, and searchable only by the
317 creating user.
318
319 Caller is responsible for deleting the directory when done with it.
320 """
321
Guido van Rossume888cdc2002-08-17 14:50:24 +0000322 if dir is None:
323 dir = gettempdir()
324
Guido van Rossum0e548712002-08-09 16:14:33 +0000325 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000326
Guido van Rossum805365e2007-05-07 22:24:25 +0000327 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000328 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000329 file = _os.path.join(dir, prefix + name + suffix)
330 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000331 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000332 return file
Guido van Rossumb940e112007-01-10 16:19:56 +0000333 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000334 if e.errno == _errno.EEXIST:
335 continue # try again
336 raise
337
338 raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
339
Guido van Rossume888cdc2002-08-17 14:50:24 +0000340def mktemp(suffix="", prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000341 """mktemp([suffix, [prefix, [dir]]])
342 User-callable function to return a unique temporary file name. The
343 file is not created.
344
Tim Peters04490bf2002-08-14 15:41:26 +0000345 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000346 not accepted.
347
348 This function is unsafe and should not be used. The file name
349 refers to a file that did not exist at some point, but by the time
350 you get around to creating it, someone else may have beaten you to
351 the punch.
352 """
353
Guido van Rossum44f602d2002-11-22 15:56:29 +0000354## from warnings import warn as _warn
355## _warn("mktemp is a potential security risk to your program",
356## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000357
Guido van Rossume888cdc2002-08-17 14:50:24 +0000358 if dir is None:
359 dir = gettempdir()
360
Guido van Rossum0e548712002-08-09 16:14:33 +0000361 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000362 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000363 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000364 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000365 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000366 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000367
Guido van Rossum0e548712002-08-09 16:14:33 +0000368 raise IOError, (_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000369
Guido van Rossum0e548712002-08-09 16:14:33 +0000370class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000371 """Temporary file wrapper
372
Guido van Rossum0e548712002-08-09 16:14:33 +0000373 This class provides a wrapper around files opened for
374 temporary use. In particular, it seeks to automatically
375 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000376 """
Tim Petersa255a722001-12-18 22:32:40 +0000377
Guido van Rossumd8faa362007-04-27 19:54:29 +0000378 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000379 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000380 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000381 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000382 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000383
Guido van Rossumca549821997-08-12 18:00:12 +0000384 def __getattr__(self, name):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000385 file = self.__dict__['file']
386 a = getattr(file, name)
Guido van Rossum6b708d51999-06-01 18:55:36 +0000387 if type(a) != type(0):
388 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000389 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000390
Guido van Rossum0e548712002-08-09 16:14:33 +0000391 # NT provides delete-on-close as a primitive, so we don't need
392 # the wrapper to do anything special. We still use it so that
393 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
394 if _os.name != 'nt':
Guido van Rossumca549821997-08-12 18:00:12 +0000395
Guido van Rossum0e548712002-08-09 16:14:33 +0000396 # Cache the unlinker so we don't get spurious errors at
397 # shutdown when the module-level "os" is None'd out. Note
398 # that this must be referenced as self.unlink, because the
399 # name TemporaryFileWrapper may also get None'd out before
400 # __del__ is called.
401 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000402
Guido van Rossum0e548712002-08-09 16:14:33 +0000403 def close(self):
404 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000405 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000406 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000407 if self.delete:
408 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000409
Guido van Rossum0e548712002-08-09 16:14:33 +0000410 def __del__(self):
411 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000412
Guido van Rossum0e548712002-08-09 16:14:33 +0000413def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
Guido van Rossumd8faa362007-04-27 19:54:29 +0000414 prefix=template, dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000415 """Create and return a temporary file.
416 Arguments:
417 'prefix', 'suffix', 'dir' -- as for mkstemp.
418 'mode' -- the mode argument to os.fdopen (default "w+b").
419 'bufsize' -- the buffer size argument to os.fdopen (default -1).
Guido van Rossumd8faa362007-04-27 19:54:29 +0000420 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000421 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000422
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000423 Returns an object with a file-like interface; the name of the file
424 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000425 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000426 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000427
Guido van Rossume888cdc2002-08-17 14:50:24 +0000428 if dir is None:
429 dir = gettempdir()
430
Tim Petersc21ea742002-08-13 23:36:01 +0000431 if 'b' in mode:
432 flags = _bin_openflags
433 else:
434 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000435
Guido van Rossum0e548712002-08-09 16:14:33 +0000436 # Setting O_TEMPORARY in the flags causes the OS to delete
437 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000438 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000439 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000440
Guido van Rossum0e548712002-08-09 16:14:33 +0000441 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
442 file = _os.fdopen(fd, mode, bufsize)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000443 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000444
Jason Tishler80c02af2002-08-14 15:10:09 +0000445if _os.name != 'posix' or _os.sys.platform == 'cygwin':
446 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
447 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000448 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000449
450else:
Guido van Rossum0e548712002-08-09 16:14:33 +0000451 def TemporaryFile(mode='w+b', bufsize=-1, suffix="",
Guido van Rossume888cdc2002-08-17 14:50:24 +0000452 prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000453 """Create and return a temporary file.
454 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000455 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 'mode' -- the mode argument to os.fdopen (default "w+b").
457 'bufsize' -- the buffer size argument to os.fdopen (default -1).
458 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000459
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000460 Returns an object with a file-like interface. The file has no
461 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000462 """
463
Guido van Rossume888cdc2002-08-17 14:50:24 +0000464 if dir is None:
465 dir = gettempdir()
466
Tim Petersc21ea742002-08-13 23:36:01 +0000467 if 'b' in mode:
468 flags = _bin_openflags
469 else:
470 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000471
472 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
473 try:
474 _os.unlink(name)
475 return _os.fdopen(fd, mode, bufsize)
476 except:
477 _os.close(fd)
478 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000479
480class SpooledTemporaryFile:
481 """Temporary file wrapper, specialized to switch from
482 StringIO to a real file when it exceeds a certain size or
483 when a fileno is needed.
484 """
485 _rolled = False
486
487 def __init__(self, max_size=0, mode='w+b', bufsize=-1,
488 suffix="", prefix=template, dir=None):
489 self._file = _StringIO()
490 self._max_size = max_size
491 self._rolled = False
492 self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir)
493
494 def _check(self, file):
495 if self._rolled: return
496 max_size = self._max_size
497 if max_size and file.tell() > max_size:
498 self.rollover()
499
500 def rollover(self):
501 if self._rolled: return
502 file = self._file
503 newfile = self._file = TemporaryFile(*self._TemporaryFileArgs)
504 del self._TemporaryFileArgs
505
506 newfile.write(file.getvalue())
507 newfile.seek(file.tell(), 0)
508
509 self._rolled = True
510
511 # file protocol
512 def __iter__(self):
513 return self._file.__iter__()
514
515 def close(self):
516 self._file.close()
517
518 @property
519 def closed(self):
520 return self._file.closed
521
522 @property
523 def encoding(self):
524 return self._file.encoding
525
526 def fileno(self):
527 self.rollover()
528 return self._file.fileno()
529
530 def flush(self):
531 self._file.flush()
532
533 def isatty(self):
534 return self._file.isatty()
535
536 @property
537 def mode(self):
538 return self._file.mode
539
540 @property
541 def name(self):
542 return self._file.name
543
544 @property
545 def newlines(self):
546 return self._file.newlines
547
548 def next(self):
549 return self._file.next
550
551 def read(self, *args):
552 return self._file.read(*args)
553
554 def readline(self, *args):
555 return self._file.readline(*args)
556
557 def readlines(self, *args):
558 return self._file.readlines(*args)
559
560 def seek(self, *args):
561 self._file.seek(*args)
562
563 @property
564 def softspace(self):
565 return self._file.softspace
566
567 def tell(self):
568 return self._file.tell()
569
570 def truncate(self):
571 self._file.truncate()
572
573 def write(self, s):
574 file = self._file
575 rv = file.write(s)
576 self._check(file)
577 return rv
578
579 def writelines(self, iterable):
580 file = self._file
581 rv = file.writelines(iterable)
582 self._check(file)
583 return rv
584
585 def xreadlines(self, *args):
586 return self._file.xreadlines(*args)