# 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 ':') # - 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). _osindex = { 'posix': ('.', '..', '/', ':', ':/bin:/usr/bin'), 'dos': ('.', '..', '\\', ';', '.;C:\\bin'), 'nt': ('.', '..', '\\', ';', '.;C:\\bin'), 'mac': (':', '::', ':', '\n', ':'), } # For freeze.py script: if 0: import posix import posixpath import sys for name in _osindex.keys(): if name in sys.builtin_module_names: curdir, pardir, sep, pathsep, defpath = _osindex[name] exec 'from %s import *' % name exec 'import %spath' % name exec 'path = %spath' % name exec 'del %spath' % name try: exec 'from %s import _exit' % name except ImportError: pass try: environ except: environ = {} # Make sure os.environ exists, at least break else: del name raise ImportError, 'no os specific module found' 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 # Provide listdir for Windows NT that doesn't have it built in if name == 'nt': try: _tmp = listdir del _tmp except NameError: def listdir(name): if path.ismount(name): list = ['.'] else: list = ['.', '..'] f = popen('dir/l/b ' + name, 'r') line = f.readline() while line: list.append(line[:-1]) line = f.readline() return list # Change environ to automatically call putenv() if it exists try: _putenv = putenv except NameError: _putenv = None if _putenv: import UserDict class _Environ(UserDict.UserDict): def __init__(self, environ): UserDict.UserDict.__init__(self) self.data = environ def __setitem__(self, key, item): putenv(key, item) self.data[key] = item environ = _Environ(environ)