mirror of
				https://github.com/python/cpython.git
				synced 2025-10-25 18:54:53 +00:00 
			
		
		
		
	 6b708d569c
			
		
	
	
		6b708d569c
		
	
	
	
	
		
			
			these happen to be 'closed' and 'softspace', which may change! Noted by Dave Ascher (with slightly different solution).
		
			
				
	
	
		
			142 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Temporary file name allocation
 | |
| #
 | |
| # XXX This tries to be not UNIX specific, but I don't know beans about
 | |
| # how to choose a temp directory or filename on MS-DOS or other
 | |
| # systems so it may have to be changed...
 | |
| 
 | |
| 
 | |
| import os
 | |
| 
 | |
| 
 | |
| # Parameters that the caller may set to override the defaults
 | |
| 
 | |
| tempdir = None
 | |
| template = None
 | |
| 
 | |
| 
 | |
| # Function to calculate the directory to use
 | |
| 
 | |
| def gettempdir():
 | |
|     global tempdir
 | |
|     if tempdir is not None:
 | |
|         return tempdir
 | |
|     try:
 | |
|         pwd = os.getcwd()
 | |
|     except (AttributeError, os.error):
 | |
|         pwd = os.curdir
 | |
|     attempdirs = ['/usr/tmp', '/tmp', pwd]
 | |
|     if os.name == 'nt':
 | |
|         attempdirs.insert(0, 'C:\\TEMP')
 | |
|         attempdirs.insert(0, '\\TEMP')
 | |
|     elif os.name == 'mac':
 | |
|         import macfs, MACFS
 | |
|         try:
 | |
|              refnum, dirid = macfs.FindFolder(MACFS.kOnSystemDisk,
 | |
|                                               MACFS.kTemporaryFolderType, 1)
 | |
|              dirname = macfs.FSSpec((refnum, dirid, '')).as_pathname()
 | |
|              attempdirs.insert(0, dirname)
 | |
|         except macfs.error:
 | |
|             pass
 | |
|     for envname in 'TMPDIR', 'TEMP', 'TMP':
 | |
|         if os.environ.has_key(envname):
 | |
|             attempdirs.insert(0, os.environ[envname])
 | |
|     testfile = gettempprefix() + 'test'
 | |
|     for dir in attempdirs:
 | |
|         try:
 | |
|             filename = os.path.join(dir, testfile)
 | |
|             fp = open(filename, 'w')
 | |
|             fp.write('blat')
 | |
|             fp.close()
 | |
|             os.unlink(filename)
 | |
|             tempdir = dir
 | |
|             break
 | |
|         except IOError:
 | |
|             pass
 | |
|     if tempdir is None:
 | |
|         msg = "Can't find a usable temporary directory amongst " + `attempdirs`
 | |
|         raise IOError, msg
 | |
|     return tempdir
 | |
| 
 | |
| 
 | |
| # Function to calculate a prefix of the filename to use
 | |
| 
 | |
| _pid = None
 | |
| 
 | |
| def gettempprefix():
 | |
|     global template, _pid
 | |
|     if os.name == 'posix' and _pid and _pid != os.getpid():
 | |
|         # Our pid changed; we must have forked -- zap the template
 | |
|         template = None
 | |
|     if template is None:
 | |
|         if os.name == 'posix':
 | |
|             _pid = os.getpid()
 | |
|             template = '@' + `_pid` + '.'
 | |
|         elif os.name == 'nt':
 | |
|             template = '~' + `os.getpid()` + '-'
 | |
|         elif os.name == 'mac':
 | |
|             template = 'Python-Tmp-'
 | |
|         else:
 | |
|             template = 'tmp' # XXX might choose a better one
 | |
|     return template
 | |
| 
 | |
| 
 | |
| # Counter for generating unique names
 | |
| 
 | |
| counter = 0
 | |
| 
 | |
| 
 | |
| # User-callable function to return a unique temporary file name
 | |
| 
 | |
| def mktemp(suffix=""):
 | |
|     global counter
 | |
|     dir = gettempdir()
 | |
|     pre = gettempprefix()
 | |
|     while 1:
 | |
|         counter = counter + 1
 | |
|         file = os.path.join(dir, pre + `counter` + suffix)
 | |
|         if not os.path.exists(file):
 | |
|             return file
 | |
| 
 | |
| 
 | |
| class TemporaryFileWrapper:
 | |
|     """Temporary file wrapper
 | |
| 
 | |
|     This class provides a wrapper around files opened for temporary use.
 | |
|     In particular, it seeks to automatically remove the file when it is
 | |
|     no longer needed.
 | |
|     """
 | |
|     def __init__(self, file, path):
 | |
|         self.file = file
 | |
|         self.path = path
 | |
| 
 | |
|     def close(self):
 | |
|         self.file.close()
 | |
|         os.unlink(self.path)
 | |
| 
 | |
|     def __del__(self):
 | |
|         try: self.close()
 | |
|         except: pass
 | |
| 
 | |
|     def __getattr__(self, name):
 | |
|         file = self.__dict__['file']
 | |
|         a = getattr(file, name)
 | |
|         if type(a) != type(0):
 | |
|             setattr(self, name, a)
 | |
|         return a
 | |
| 
 | |
| 
 | |
| def TemporaryFile(mode='w+b', bufsize=-1, suffix=""):
 | |
|     name = mktemp(suffix)
 | |
|     if os.name == 'posix':
 | |
|         # Unix -- be very careful
 | |
|         fd = os.open(name, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700)
 | |
|         try:
 | |
|             os.unlink(name)
 | |
|             return os.fdopen(fd, mode, bufsize)
 | |
|         except:
 | |
|             os.close(fd)
 | |
|             raise
 | |
|     else:
 | |
|         # Non-unix -- can't unlink file that's still open, use wrapper
 | |
|         file = open(name, mode, bufsize)
 | |
|         return TemporaryFileWrapper(file, name)
 |