blob: b6b3b9650c558ce6c963f2cbb9812de8a7fc56c1 [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 Rossum9a634702007-07-09 10:24:45 +000032import 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
37if _os.name == 'mac':
Jack Jansenbb829b72003-03-21 12:55:38 +000038 import Carbon.Folder as _Folder
39 import Carbon.Folders as _Folders
Guido van Rossum0e548712002-08-09 16:14:33 +000040
Guido van Rossumd8faa362007-04-27 19:54:29 +000041try:
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
81tempdir = None
82
83# Internal routines.
84
85_once_lock = _allocate_lock()
86
Guido van Rossumb256159392003-11-10 02:16:36 +000087if hasattr(_os, "lstat"):
88 _stat = _os.lstat
89elif hasattr(_os, "stat"):
90 _stat = _os.stat
91else:
92 # Fallback. All we need is something that raises os.error if the
93 # file doesn't exist.
94 def _stat(fn):
95 try:
96 f = open(fn)
97 except IOError:
98 raise _os.error
99 f.close()
100
101def _exists(fn):
102 try:
103 _stat(fn)
104 except _os.error:
105 return False
106 else:
107 return True
108
Guido van Rossum0e548712002-08-09 16:14:33 +0000109class _RandomNameSequence:
110 """An instance of _RandomNameSequence generates an endless
111 sequence of unpredictable strings which can safely be incorporated
112 into file names. Each string is six characters long. Multiple
113 threads can safely use the same instance at the same time.
114
115 _RandomNameSequence is an iterator."""
116
Tim Peters97701b52002-11-21 15:59:59 +0000117 characters = ("abcdefghijklmnopqrstuvwxyz" +
118 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
Guido van Rossumd8faa362007-04-27 19:54:29 +0000119 "0123456789_")
Guido van Rossum0e548712002-08-09 16:14:33 +0000120
121 def __init__(self):
122 self.mutex = _allocate_lock()
123 self.rng = _Random()
124 self.normcase = _os.path.normcase
Tim Peters97701b52002-11-21 15:59:59 +0000125
Guido van Rossum0e548712002-08-09 16:14:33 +0000126 def __iter__(self):
127 return self
128
Georg Brandla18af4e2007-04-21 15:47:16 +0000129 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000130 m = self.mutex
131 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000132 choose = self.rng.choice
Guido van Rossum0e548712002-08-09 16:14:33 +0000133
Tim Peters97701b52002-11-21 15:59:59 +0000134 m.acquire()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000135 try:
Tim Peters97701b52002-11-21 15:59:59 +0000136 letters = [choose(c) for dummy in "123456"]
Guido van Rossum0e548712002-08-09 16:14:33 +0000137 finally:
138 m.release()
139
Tim Peters97701b52002-11-21 15:59:59 +0000140 return self.normcase(''.join(letters))
Guido van Rossum0e548712002-08-09 16:14:33 +0000141
142def _candidate_tempdir_list():
143 """Generate a list of candidate temporary directories which
144 _get_default_tempdir will try."""
145
146 dirlist = []
147
148 # First, try the environment.
149 for envname in 'TMPDIR', 'TEMP', 'TMP':
150 dirname = _os.getenv(envname)
151 if dirname: dirlist.append(dirname)
152
153 # Failing that, try OS-specific locations.
154 if _os.name == 'mac':
155 try:
Jack Jansenbb829b72003-03-21 12:55:38 +0000156 fsr = _Folder.FSFindFolder(_Folders.kOnSystemDisk,
157 _Folders.kTemporaryFolderType, 1)
158 dirname = fsr.as_pathname()
Guido van Rossum0e548712002-08-09 16:14:33 +0000159 dirlist.append(dirname)
Jack Jansenbb829b72003-03-21 12:55:38 +0000160 except _Folder.error:
Guido van Rossum0e548712002-08-09 16:14:33 +0000161 pass
Guido van Rossum0e548712002-08-09 16:14:33 +0000162 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.
Guido van Rossum805365e2007-05-07 22:24:25 +0000192 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000193 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000194 filename = _os.path.join(dir, name)
195 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000196 fd = _os.open(filename, flags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000197 fp = _io.open(fd, 'wb')
198 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000199 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000200 _os.unlink(filename)
201 del fp, fd
202 return dir
Guido van Rossumb940e112007-01-10 16:19:56 +0000203 except (OSError, IOError) as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000204 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
Guido van Rossum805365e2007-05-07 22:24:25 +0000231 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000232 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000233 file = _os.path.join(dir, pre + name + suf)
234 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000235 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000236 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000237 return (fd, _os.path.abspath(file))
Guido van Rossumb940e112007-01-10 16:19:56 +0000238 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000239 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():
255 """Accessor for tempdir.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):
Tim Peters04490bf2002-08-14 15:41:26 +0000267 """mkstemp([suffix, [prefix, [dir, [text]]]])
Guido van Rossum0e548712002-08-09 16:14:33 +0000268 User-callable function to create and return a unique temporary
269 file. The return value is a pair (fd, name) where fd is the
270 file descriptor returned by os.open, and name is the filename.
271
272 If 'suffix' is specified, the file name will end with that suffix,
273 otherwise there will be no suffix.
274
275 If 'prefix' is specified, the file name will begin with that prefix,
276 otherwise a default prefix is used.
277
278 If 'dir' is specified, the file will be created in that directory,
279 otherwise a default directory is used.
280
Tim Peters04490bf2002-08-14 15:41:26 +0000281 If 'text' is specified and true, the file is opened in text
282 mode. Else (the default) the file is opened in binary mode. On
283 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000284
285 The file is readable and writable only by the creating user ID.
286 If the operating system uses permission bits to indicate whether a
287 file is executable, the file is executable by no one. The file
288 descriptor is not inherited by children of this process.
289
290 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000291 """
292
Guido van Rossume888cdc2002-08-17 14:50:24 +0000293 if dir is None:
294 dir = gettempdir()
295
Tim Peters04490bf2002-08-14 15:41:26 +0000296 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000297 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000298 else:
299 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000300
301 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000302
Guido van Rossumeee94981991-11-12 15:38:08 +0000303
Guido van Rossume888cdc2002-08-17 14:50:24 +0000304def mkdtemp(suffix="", prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000305 """mkdtemp([suffix, [prefix, [dir]]])
306 User-callable function to create and return a unique temporary
307 directory. The return value is the pathname of the directory.
308
Tim Peters04490bf2002-08-14 15:41:26 +0000309 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000310 not accepted.
311
312 The directory is readable, writable, and searchable only by the
313 creating user.
314
315 Caller is responsible for deleting the directory when done with it.
316 """
317
Guido van Rossume888cdc2002-08-17 14:50:24 +0000318 if dir is None:
319 dir = gettempdir()
320
Guido van Rossum0e548712002-08-09 16:14:33 +0000321 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000322
Guido van Rossum805365e2007-05-07 22:24:25 +0000323 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000324 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000325 file = _os.path.join(dir, prefix + name + suffix)
326 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000327 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000328 return file
Guido van Rossumb940e112007-01-10 16:19:56 +0000329 except OSError as e:
Guido van Rossum0e548712002-08-09 16:14:33 +0000330 if e.errno == _errno.EEXIST:
331 continue # try again
332 raise
333
334 raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
335
Guido van Rossume888cdc2002-08-17 14:50:24 +0000336def mktemp(suffix="", prefix=template, dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000337 """mktemp([suffix, [prefix, [dir]]])
338 User-callable function to return a unique temporary file name. The
339 file is not created.
340
Tim Peters04490bf2002-08-14 15:41:26 +0000341 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000342 not accepted.
343
344 This function is unsafe and should not be used. The file name
345 refers to a file that did not exist at some point, but by the time
346 you get around to creating it, someone else may have beaten you to
347 the punch.
348 """
349
Guido van Rossum44f602d2002-11-22 15:56:29 +0000350## from warnings import warn as _warn
351## _warn("mktemp is a potential security risk to your program",
352## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000353
Guido van Rossume888cdc2002-08-17 14:50:24 +0000354 if dir is None:
355 dir = gettempdir()
356
Guido van Rossum0e548712002-08-09 16:14:33 +0000357 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000358 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000359 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000360 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000361 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000362 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000363
Guido van Rossum0e548712002-08-09 16:14:33 +0000364 raise IOError, (_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000365
Guido van Rossum0e548712002-08-09 16:14:33 +0000366class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000367 """Temporary file wrapper
368
Guido van Rossum0e548712002-08-09 16:14:33 +0000369 This class provides a wrapper around files opened for
370 temporary use. In particular, it seeks to automatically
371 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000372 """
Tim Petersa255a722001-12-18 22:32:40 +0000373
Guido van Rossumd8faa362007-04-27 19:54:29 +0000374 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000375 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000376 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000377 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000378 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000379
Guido van Rossumca549821997-08-12 18:00:12 +0000380 def __getattr__(self, name):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000381 file = self.__dict__['file']
382 a = getattr(file, name)
Guido van Rossum6b708d51999-06-01 18:55:36 +0000383 if type(a) != type(0):
384 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000385 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000386
Guido van Rossum0e548712002-08-09 16:14:33 +0000387 # NT provides delete-on-close as a primitive, so we don't need
388 # the wrapper to do anything special. We still use it so that
389 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
390 if _os.name != 'nt':
Guido van Rossumca549821997-08-12 18:00:12 +0000391
Guido van Rossum0e548712002-08-09 16:14:33 +0000392 # Cache the unlinker so we don't get spurious errors at
393 # shutdown when the module-level "os" is None'd out. Note
394 # that this must be referenced as self.unlink, because the
395 # name TemporaryFileWrapper may also get None'd out before
396 # __del__ is called.
397 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000398
Guido van Rossum0e548712002-08-09 16:14:33 +0000399 def close(self):
400 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000401 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000402 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000403 if self.delete:
404 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000405
Guido van Rossum0e548712002-08-09 16:14:33 +0000406 def __del__(self):
407 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000408
Guido van Rossumf0c74162007-08-28 03:29:45 +0000409def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
410 newline=None, suffix="", prefix=template,
411 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000412 """Create and return a temporary file.
413 Arguments:
414 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000415 'mode' -- the mode argument to io.open (default "w+b").
416 'buffering' -- the buffer size argument to io.open (default -1).
417 'encoding' -- the encoding argument to io.open (default None)
418 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000419 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000420 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000421
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000422 Returns an object with a file-like interface; the name of the file
423 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000424 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000425 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000426
Guido van Rossume888cdc2002-08-17 14:50:24 +0000427 if dir is None:
428 dir = gettempdir()
429
Tim Petersc21ea742002-08-13 23:36:01 +0000430 if 'b' in mode:
431 flags = _bin_openflags
432 else:
433 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000434
Guido van Rossum0e548712002-08-09 16:14:33 +0000435 # Setting O_TEMPORARY in the flags causes the OS to delete
436 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000437 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000438 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000439
Guido van Rossum0e548712002-08-09 16:14:33 +0000440 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000441 file = _io.open(fd, mode, buffering=buffering,
442 newline=newline, encoding=encoding)
443
Guido van Rossumd8faa362007-04-27 19:54:29 +0000444 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000445
Jason Tishler80c02af2002-08-14 15:10:09 +0000446if _os.name != 'posix' or _os.sys.platform == 'cygwin':
447 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
448 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000449 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000450
451else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000452 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
453 newline=None, suffix="", prefix=template,
454 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000455 """Create and return a temporary file.
456 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000457 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000458 'mode' -- the mode argument to io.open (default "w+b").
459 'buffering' -- the buffer size argument to io.open (default -1).
460 'encoding' -- the encoding argument to io.open (default None)
461 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000462 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000463
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000464 Returns an object with a file-like interface. The file has no
465 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000466 """
467
Guido van Rossume888cdc2002-08-17 14:50:24 +0000468 if dir is None:
469 dir = gettempdir()
470
Tim Petersc21ea742002-08-13 23:36:01 +0000471 if 'b' in mode:
472 flags = _bin_openflags
473 else:
474 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000475
476 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
477 try:
478 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000479 return _io.open(fd, mode, buffering=buffering,
480 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000481 except:
482 _os.close(fd)
483 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484
485class SpooledTemporaryFile:
486 """Temporary file wrapper, specialized to switch from
487 StringIO to a real file when it exceeds a certain size or
488 when a fileno is needed.
489 """
490 _rolled = False
491
Guido van Rossumf0c74162007-08-28 03:29:45 +0000492 def __init__(self, max_size=0, mode='w+b', buffering=-1,
493 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000494 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000495 if 'b' in mode:
496 self._file = _io.BytesIO()
497 else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000498 self._file = _io.StringIO(encoding=encoding, newline=newline)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000499 self._max_size = max_size
500 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000501 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
502 'suffix': suffix, 'prefix': prefix,
503 'encoding': encoding, 'newline': newline,
504 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000505
506 def _check(self, file):
507 if self._rolled: return
508 max_size = self._max_size
509 if max_size and file.tell() > max_size:
510 self.rollover()
511
512 def rollover(self):
513 if self._rolled: return
514 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000515 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000516 del self._TemporaryFileArgs
517
518 newfile.write(file.getvalue())
519 newfile.seek(file.tell(), 0)
520
521 self._rolled = True
522
523 # file protocol
524 def __iter__(self):
525 return self._file.__iter__()
526
527 def close(self):
528 self._file.close()
529
530 @property
531 def closed(self):
532 return self._file.closed
533
534 @property
535 def encoding(self):
536 return self._file.encoding
537
538 def fileno(self):
539 self.rollover()
540 return self._file.fileno()
541
542 def flush(self):
543 self._file.flush()
544
545 def isatty(self):
546 return self._file.isatty()
547
548 @property
549 def mode(self):
550 return self._file.mode
551
552 @property
553 def name(self):
554 return self._file.name
555
556 @property
557 def newlines(self):
558 return self._file.newlines
559
560 def next(self):
561 return self._file.next
562
563 def read(self, *args):
564 return self._file.read(*args)
565
566 def readline(self, *args):
567 return self._file.readline(*args)
568
569 def readlines(self, *args):
570 return self._file.readlines(*args)
571
572 def seek(self, *args):
573 self._file.seek(*args)
574
575 @property
576 def softspace(self):
577 return self._file.softspace
578
579 def tell(self):
580 return self._file.tell()
581
582 def truncate(self):
583 self._file.truncate()
584
585 def write(self, s):
586 file = self._file
587 rv = file.write(s)
588 self._check(file)
589 return rv
590
591 def writelines(self, iterable):
592 file = self._file
593 rv = file.writelines(iterable)
594 self._check(file)
595 return rv
596
597 def xreadlines(self, *args):
598 return self._file.xreadlines(*args)