blob: 900222fca7a7fa333cbc6c4144c8a799b9b5dee4 [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
22 "mkstemp", "mkdtemp", # low level safe interfaces
23 "mktemp", # deprecated unsafe interface
24 "TMP_MAX", "gettempprefix", # constants
25 "tempdir", "gettempdir"
26 ]
Guido van Rossum41f95031992-03-31 19:02:01 +000027
Tim Peters4fd5a062002-01-28 23:11:23 +000028
Guido van Rossum0e548712002-08-09 16:14:33 +000029# Imports.
Tim Peters4fd5a062002-01-28 23:11:23 +000030
Guido van Rossum0e548712002-08-09 16:14:33 +000031import os as _os
32import errno as _errno
33from random import Random as _Random
34
35if _os.name == 'mac':
36 import macfs as _macfs
37 import MACFS as _MACFS
38
39try:
40 import fcntl as _fcntl
41 def _set_cloexec(fd):
42 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
43 if flags >= 0:
44 # flags read successfully, modify
45 flags |= _fcntl.FD_CLOEXEC
46 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
47except (ImportError, AttributeError):
48 def _set_cloexec(fd):
49 pass
50
51try:
52 import thread as _thread
53 _allocate_lock = _thread.allocate_lock
54except (ImportError, AttributeError):
55 class _allocate_lock:
56 def acquire(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000057 pass
Guido van Rossum0e548712002-08-09 16:14:33 +000058 release = acquire
59
60_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000061if hasattr(_os, 'O_NOINHERIT'):
62 _text_openflags |= _os.O_NOINHERIT
63if hasattr(_os, 'O_NOFOLLOW'):
64 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000065
66_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000067if hasattr(_os, 'O_BINARY'):
68 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000069
70if hasattr(_os, 'TMP_MAX'):
71 TMP_MAX = _os.TMP_MAX
72else:
73 TMP_MAX = 10000
74
Tim Petersbd7b4c72002-08-13 23:33:56 +000075template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000076
77tempdir = None
78
79# Internal routines.
80
81_once_lock = _allocate_lock()
82
83def _once(var, initializer):
84 """Wrapper to execute an initialization operation just once,
85 even if multiple threads reach the same point at the same time.
86
87 var is the name (as a string) of the variable to be entered into
88 the current global namespace.
89
90 initializer is a callable which will return the appropriate initial
91 value for variable. It will be called only if variable is not
92 present in the global namespace, or its current value is None.
93
94 Do not call _once from inside an initializer routine, it will deadlock.
95 """
96
97 vars = globals()
Guido van Rossum0e548712002-08-09 16:14:33 +000098 # Check first outside the lock.
Tim Petersfd0f0c92002-08-13 23:29:21 +000099 if vars.get(var) is not None:
Guido van Rossum0e548712002-08-09 16:14:33 +0000100 return
101 try:
Tim Peters1749b252002-08-13 23:31:02 +0000102 _once_lock.acquire()
Guido van Rossum0e548712002-08-09 16:14:33 +0000103 # Check again inside the lock.
Tim Petersfd0f0c92002-08-13 23:29:21 +0000104 if vars.get(var) is not None:
Guido van Rossum0e548712002-08-09 16:14:33 +0000105 return
106 vars[var] = initializer()
107 finally:
Tim Peters1749b252002-08-13 23:31:02 +0000108 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000109
110class _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
118 characters = ( "abcdefghijklmnopqrstuvwxyz"
119 + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
120 + "0123456789-_")
121
122 def __init__(self):
123 self.mutex = _allocate_lock()
124 self.rng = _Random()
125 self.normcase = _os.path.normcase
126 def __iter__(self):
127 return self
128
129 def next(self):
130 m = self.mutex
131 c = self.characters
132 r = self.rng
133
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000134 try:
Guido van Rossum0e548712002-08-09 16:14:33 +0000135 m.acquire()
136 letters = ''.join([r.choice(c), r.choice(c), r.choice(c),
137 r.choice(c), r.choice(c), r.choice(c)])
138 finally:
139 m.release()
140
141 return self.normcase(letters)
142
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:
157 refnum, dirid = _macfs.FindFolder(_MACFS.kOnSystemDisk,
158 _MACFS.kTemporaryFolderType, 1)
159 dirname = _macfs.FSSpec((refnum, dirid, '')).as_pathname()
160 dirlist.append(dirname)
161 except _macfs.error:
162 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.
181 This routine should be called through '_once' (see above) as we
182 do not want multiple threads attempting this calculation simultaneously.
183
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
215def _get_candidate_names():
216 """Common setup sequence for all user-callable interfaces."""
217
218 _once('_name_sequence', _RandomNameSequence)
219 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000220
221
Guido van Rossum0e548712002-08-09 16:14:33 +0000222def _mkstemp_inner(dir, pre, suf, flags):
223 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000224
Guido van Rossum0e548712002-08-09 16:14:33 +0000225 names = _get_candidate_names()
226
227 for seq in xrange(TMP_MAX):
228 name = names.next()
229 file = _os.path.join(dir, pre + name + suf)
230 try:
231 fd = _os.open(file, flags, 0600)
232 _set_cloexec(fd)
233 return (fd, file)
234 except OSError, e:
235 if e.errno == _errno.EEXIST:
236 continue # try again
237 raise
238
239 raise IOError, (_errno.EEXIST, "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000240
Guido van Rossum0e548712002-08-09 16:14:33 +0000241
242# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000243
Guido van Rossum41f95031992-03-31 19:02:01 +0000244def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000245 """Accessor for tempdir.template."""
246 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000247
Guido van Rossum0e548712002-08-09 16:14:33 +0000248def gettempdir():
249 """Accessor for tempdir.tempdir."""
250 _once('tempdir', _get_default_tempdir)
251 return tempdir
252
Tim Peters04490bf2002-08-14 15:41:26 +0000253def mkstemp(suffix="", prefix=template, dir=gettempdir(), text=False):
254 """mkstemp([suffix, [prefix, [dir, [text]]]])
Guido van Rossum0e548712002-08-09 16:14:33 +0000255 User-callable function to create and return a unique temporary
256 file. The return value is a pair (fd, name) where fd is the
257 file descriptor returned by os.open, and name is the filename.
258
259 If 'suffix' is specified, the file name will end with that suffix,
260 otherwise there will be no suffix.
261
262 If 'prefix' is specified, the file name will begin with that prefix,
263 otherwise a default prefix is used.
264
265 If 'dir' is specified, the file will be created in that directory,
266 otherwise a default directory is used.
267
Tim Peters04490bf2002-08-14 15:41:26 +0000268 If 'text' is specified and true, the file is opened in text
269 mode. Else (the default) the file is opened in binary mode. On
270 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000271
272 The file is readable and writable only by the creating user ID.
273 If the operating system uses permission bits to indicate whether a
274 file is executable, the file is executable by no one. The file
275 descriptor is not inherited by children of this process.
276
277 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000278 """
279
Tim Peters04490bf2002-08-14 15:41:26 +0000280 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000281 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000282 else:
283 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000284
285 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000286
Guido van Rossumeee94981991-11-12 15:38:08 +0000287
Guido van Rossum0e548712002-08-09 16:14:33 +0000288def mkdtemp(suffix="", prefix=template, dir=gettempdir()):
289 """mkdtemp([suffix, [prefix, [dir]]])
290 User-callable function to create and return a unique temporary
291 directory. The return value is the pathname of the directory.
292
Tim Peters04490bf2002-08-14 15:41:26 +0000293 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000294 not accepted.
295
296 The directory is readable, writable, and searchable only by the
297 creating user.
298
299 Caller is responsible for deleting the directory when done with it.
300 """
301
302 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000303
Guido van Rossum0e548712002-08-09 16:14:33 +0000304 for seq in xrange(TMP_MAX):
305 name = names.next()
306 file = _os.path.join(dir, prefix + name + suffix)
307 try:
308 _os.mkdir(file, 0700)
309 return file
310 except OSError, e:
311 if e.errno == _errno.EEXIST:
312 continue # try again
313 raise
314
315 raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
316
317def mktemp(suffix="", prefix=template, dir=gettempdir()):
318 """mktemp([suffix, [prefix, [dir]]])
319 User-callable function to return a unique temporary file name. The
320 file is not created.
321
Tim Peters04490bf2002-08-14 15:41:26 +0000322 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000323 not accepted.
324
325 This function is unsafe and should not be used. The file name
326 refers to a file that did not exist at some point, but by the time
327 you get around to creating it, someone else may have beaten you to
328 the punch.
329 """
330
331 from warnings import warn as _warn
332 _warn("mktemp is a potential security risk to your program",
333 RuntimeWarning, stacklevel=2)
334
335 names = _get_candidate_names()
336 for seq in xrange(TMP_MAX):
337 name = names.next()
338 file = _os.path.join(dir, prefix + name + suffix)
339 if not _os.path.exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000340 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000341
Guido van Rossum0e548712002-08-09 16:14:33 +0000342 raise IOError, (_errno.EEXIST, "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000343
Guido van Rossum0e548712002-08-09 16:14:33 +0000344class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000345 """Temporary file wrapper
346
Guido van Rossum0e548712002-08-09 16:14:33 +0000347 This class provides a wrapper around files opened for
348 temporary use. In particular, it seeks to automatically
349 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000350 """
Tim Petersa255a722001-12-18 22:32:40 +0000351
Guido van Rossum0e548712002-08-09 16:14:33 +0000352 def __init__(self, file, name):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000353 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000354 self.name = name
Tim Petersc57a2852001-10-29 21:46:08 +0000355 self.close_called = 0
Guido van Rossumca549821997-08-12 18:00:12 +0000356
Guido van Rossumca549821997-08-12 18:00:12 +0000357 def __getattr__(self, name):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000358 file = self.__dict__['file']
359 a = getattr(file, name)
Guido van Rossum6b708d51999-06-01 18:55:36 +0000360 if type(a) != type(0):
361 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000362 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000363
Guido van Rossum0e548712002-08-09 16:14:33 +0000364 # NT provides delete-on-close as a primitive, so we don't need
365 # the wrapper to do anything special. We still use it so that
366 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
367 if _os.name != 'nt':
Guido van Rossumca549821997-08-12 18:00:12 +0000368
Guido van Rossum0e548712002-08-09 16:14:33 +0000369 # Cache the unlinker so we don't get spurious errors at
370 # shutdown when the module-level "os" is None'd out. Note
371 # that this must be referenced as self.unlink, because the
372 # name TemporaryFileWrapper may also get None'd out before
373 # __del__ is called.
374 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000375
Guido van Rossum0e548712002-08-09 16:14:33 +0000376 def close(self):
377 if not self.close_called:
378 self.close_called = 1
379 self.file.close()
380 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000381
Guido van Rossum0e548712002-08-09 16:14:33 +0000382 def __del__(self):
383 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000384
Guido van Rossum0e548712002-08-09 16:14:33 +0000385def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
386 prefix=template, dir=gettempdir()):
387 """Create and return a temporary file.
388 Arguments:
389 'prefix', 'suffix', 'dir' -- as for mkstemp.
390 'mode' -- the mode argument to os.fdopen (default "w+b").
391 'bufsize' -- the buffer size argument to os.fdopen (default -1).
392 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000393
Guido van Rossum0e548712002-08-09 16:14:33 +0000394 Returns a file object; the name of the file is accessible as
395 file.name. The file will be automatically deleted when it is
396 closed.
397 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000398
Tim Petersc21ea742002-08-13 23:36:01 +0000399 if 'b' in mode:
400 flags = _bin_openflags
401 else:
402 flags = _text_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000403
Guido van Rossum0e548712002-08-09 16:14:33 +0000404 # Setting O_TEMPORARY in the flags causes the OS to delete
405 # the file when it is closed. This is only supported by Windows.
406 if _os.name == 'nt':
407 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000408
Guido van Rossum0e548712002-08-09 16:14:33 +0000409 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
410 file = _os.fdopen(fd, mode, bufsize)
411 return _TemporaryFileWrapper(file, name)
412
Jason Tishler80c02af2002-08-14 15:10:09 +0000413if _os.name != 'posix' or _os.sys.platform == 'cygwin':
414 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
415 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000416 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000417
418else:
Guido van Rossum0e548712002-08-09 16:14:33 +0000419 def TemporaryFile(mode='w+b', bufsize=-1, suffix="",
420 prefix=template, dir=gettempdir()):
421 """Create and return a temporary file.
422 Arguments:
423 'prefix', 'suffix', 'directory' -- as for mkstemp.
424 'mode' -- the mode argument to os.fdopen (default "w+b").
425 'bufsize' -- the buffer size argument to os.fdopen (default -1).
426 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000427
Guido van Rossum0e548712002-08-09 16:14:33 +0000428 Returns a file object. The file has no name, and will cease to
429 exist when it is closed.
430 """
431
Tim Petersc21ea742002-08-13 23:36:01 +0000432 if 'b' in mode:
433 flags = _bin_openflags
434 else:
435 flags = _text_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000436
437 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
438 try:
439 _os.unlink(name)
440 return _os.fdopen(fd, mode, bufsize)
441 except:
442 _os.close(fd)
443 raise