# os.py -- either mac, dos or posix depending on what system we're on. # This exports: # - all functions from either posix or mac, e.g., os.unlink, os.stat, etc. # - os.path is either module posixpath or macpath # - os.name is either 'posix' or 'mac' # - os.curdir is a string representing the current directory ('.' or ':') # - os.pardir is a string representing the parent directory ('..' or '::') # - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\') # - os.altsep is the alternatte pathname separator (None or '/') # - os.pathsep is the component separator used in $PATH etc # - os.defpath is the default search path for executables # Programs that import and use 'os' stand a better chance of being # portable between different platforms. Of course, they must then # only use functions that are defined by all platforms (e.g., unlink # and opendir), and leave all pathname manipulation to os.path # (e.g., split and join). import sys _names = sys.builtin_module_names altsep = None if 'posix' in _names: name = 'posix' linesep = '\n' curdir = '.'; pardir = '..'; sep = '/'; pathsep = ':' defpath = ':/bin:/usr/bin' from posix import * try: from posix import _exit except ImportError: pass import posixpath path = posixpath del posixpath elif 'nt' in _names: name = 'nt' linesep = '\r\n' curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';' defpath = '.;C:\\bin' from nt import * try: from nt import _exit except ImportError: pass import ntpath path = ntpath del ntpath elif 'dos' in _names: name = 'dos' linesep = '\r\n' curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';' defpath = '.;C:\\bin' from dos import * try: from dos import _exit except ImportError: pass import dospath path = dospath del dospath elif 'os2' in _names: name = 'os2' linesep = '\r\n' curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';' defpath = '.;C:\\bin' from os2 import * try: from os2 import _exit except ImportError: pass import ntpath path = ntpath del ntpath elif 'mac' in _names: name = 'mac' linesep = '\r' curdir = ':'; pardir = '::'; sep = ':'; pathsep = '\n' defpath = ':' from mac import * try: from mac import _exit except ImportError: pass import macpath path = macpath del macpath else: raise ImportError, 'no os specific module found' del _names # Make sure os.environ exists, at least try: environ except NameError: environ = {} def execl(file, *args): execv(file, args) def execle(file, *args): env = args[-1] execve(file, args[:-1], env) def execlp(file, *args): execvp(file, args) def execlpe(file, *args): env = args[-1] execvpe(file, args[:-1], env) def execvp(file, args): _execvpe(file, args) def execvpe(file, args, env): _execvpe(file, args, env) _notfound = None def _execvpe(file, args, env = None): if env: func = execve argrest = (args, env) else: func = execv argrest = (args,) env = environ global _notfound head, tail = path.split(file) if head: apply(func, (file,) + argrest) return if env.has_key('PATH'): envpath = env['PATH'] else: envpath = defpath import string PATH = string.splitfields(envpath, pathsep) if not _notfound: import tempfile # Exec a file that is guaranteed not to exist try: execv(tempfile.mktemp(), ()) except error, _notfound: pass exc, arg = error, _notfound for dir in PATH: fullname = path.join(dir, file) try: apply(func, (fullname,) + argrest) except error, (errno, msg): if errno != arg[0]: exc, arg = error, (errno, msg) raise exc, arg # Change environ to automatically call putenv() if it exists try: # This will fail if there's no putenv putenv except NameError: pass else: import UserDict if name in ('os2', ): # Where Env Var Names Must Be UPPERCASE import string class _Environ(UserDict.UserDict): def __init__(self, environ): UserDict.UserDict.__init__(self) self.data = environ def __setitem__(self, key, item): key = string.upper(key) putenv(key, item) self.data[key] = item def __getitem__(self, key): return self.data[string.upper(key)] else: # Where Env Var Names Can Be Mixed Case class _Environ(UserDict.UserDict): def __init__(self, environ): UserDict.UserDict.__init__(self) self.data = environ def __getinitargs__(self): import copy return (copy.copy(self.data),) def __setitem__(self, key, item): putenv(key, item) self.data[key] = item def __copy__(self): return _Environ(self.data.copy()) environ = _Environ(environ)