| # 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) |