blob: 615b8033db68cf86b18b3e37b8f349905fdcfd97 [file] [log] [blame]
Guido van Rossumeee94981991-11-12 15:38:08 +00001# Temporary file name allocation
Guido van Rossum41f95031992-03-31 19:02:01 +00002#
3# XXX This tries to be not UNIX specific, but I don't know beans about
4# how to choose a temp directory or filename on MS-DOS or other
5# systems so it may have to be changed...
Guido van Rossumeee94981991-11-12 15:38:08 +00006
7
Guido van Rossum41f95031992-03-31 19:02:01 +00008import os
Guido van Rossumeee94981991-11-12 15:38:08 +00009
Guido van Rossumeee94981991-11-12 15:38:08 +000010
Guido van Rossum41f95031992-03-31 19:02:01 +000011# Parameters that the caller may set to override the defaults
Guido van Rossumcff34541992-01-14 18:31:56 +000012
Guido van Rossum41f95031992-03-31 19:02:01 +000013tempdir = None
14template = None
15
16
17# Function to calculate the directory to use
18
19def gettempdir():
Guido van Rossumf4aaf861996-05-28 23:31:34 +000020 global tempdir
Guido van Rossum4033ad71996-08-08 18:33:56 +000021 if tempdir is not None:
22 return tempdir
Guido van Rossumf4aaf861996-05-28 23:31:34 +000023 attempdirs = ['/usr/tmp', '/tmp', os.getcwd(), os.curdir]
Guido van Rossum3e065ad1996-08-20 20:38:59 +000024 if os.name == 'nt':
25 attempdirs.insert(0, 'C:\\TEMP')
26 attempdirs.insert(0, '\\TEMP')
Guido van Rossumf4aaf861996-05-28 23:31:34 +000027 if os.environ.has_key('TMPDIR'):
28 attempdirs.insert(0, os.environ['TMPDIR'])
Guido van Rossum3e065ad1996-08-20 20:38:59 +000029 testfile = gettempprefix() + 'test'
Guido van Rossumf4aaf861996-05-28 23:31:34 +000030 for dir in attempdirs:
31 try:
32 filename = os.path.join(dir, testfile)
33 fp = open(filename, 'w')
34 fp.write('blat')
35 fp.close()
36 os.unlink(filename)
37 tempdir = dir
38 break
39 except IOError:
40 pass
41 if tempdir is None:
42 msg = "Can't find a usable temporary directory amongst " + `attempdirs`
43 raise IOError, msg
44 return tempdir
Guido van Rossum41f95031992-03-31 19:02:01 +000045
46
47# Function to calculate a prefix of the filename to use
48
49def gettempprefix():
50 global template
51 if template == None:
52 if os.name == 'posix':
53 template = '@' + `os.getpid()` + '.'
54 else:
55 template = 'tmp' # XXX might choose a better one
56 return template
Guido van Rossumcff34541992-01-14 18:31:56 +000057
Guido van Rossumeee94981991-11-12 15:38:08 +000058
Guido van Rossum4a3a41f1991-12-26 13:10:50 +000059# Counter for generating unique names
Guido van Rossumeee94981991-11-12 15:38:08 +000060
Guido van Rossum4a3a41f1991-12-26 13:10:50 +000061counter = 0
Guido van Rossumeee94981991-11-12 15:38:08 +000062
63
Guido van Rossum41f95031992-03-31 19:02:01 +000064# User-callable function to return a unique temporary file name
Guido van Rossumeee94981991-11-12 15:38:08 +000065
66def mktemp():
Guido van Rossum4a3a41f1991-12-26 13:10:50 +000067 global counter
Guido van Rossum41f95031992-03-31 19:02:01 +000068 dir = gettempdir()
69 pre = gettempprefix()
Guido van Rossumeee94981991-11-12 15:38:08 +000070 while 1:
Guido van Rossum41f95031992-03-31 19:02:01 +000071 counter = counter + 1
72 file = os.path.join(dir, pre + `counter`)
73 if not os.path.exists(file):
74 return file