summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/os.py96
1 files changed, 57 insertions, 39 deletions
diff --git a/Lib/os.py b/Lib/os.py
index bb90f2e..dda3213 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -7,6 +7,8 @@
# - 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
@@ -14,40 +16,29 @@
# and opendir), and leave all pathname manipulation to os.path
# (e.g., split and join).
-# XXX This is incorrect if the import *path fails...
+_osindex = {
+ 'posix': ('.', '..', '/', ':', ':/bin:/usr/bin'),
+ 'dos': ('.', '..', '\\', ';', '.;C:\\bin'),
+ 'nt': ('.', '..', '\\', ';', '.;C:\\bin'),
+ 'mac': (':', '::', ':', ' ', ':'),
+}
-try:
- from posix import *
- try:
- from posix import _exit
- except ImportError:
- pass
- name = 'posix'
- curdir = '.'
- pardir = '..'
- sep = '/'
- import posixpath
- path = posixpath
- del posixpath
-except ImportError:
- try:
- from mac import *
- name = 'mac'
- curdir = ':'
- pardir = '::'
- sep = ':'
- import macpath
- path = macpath
- del macpath
- except ImportError:
- from dos import *
- name = 'dos'
- curdir = '.' # XXX doesn't always work
- pardir = '..' # XXX doesn't always work
- sep = '/' # XXX or '\\' ???
- import dospath
- path = dospath
- del dospath
+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
+ break
+else:
+ del name
+ raise ImportError, 'no os specific module found'
def execl(file, *args):
execv(file, args)
@@ -59,22 +50,49 @@ def execle(file, *args):
def execlp(file, *args):
execvp(file, args)
+_notfound = None
def execvp(file, args):
- if '/' in file:
+ global _notfound
+ head, tail = path.split(file)
+ if head:
execv(file, args)
return
ENOENT = 2
if environ.has_key('PATH'):
- import string
- PATH = string.splitfields(environ['PATH'], ':')
+ envpath = environ['PATH']
else:
- PATH = ['', '/bin', '/usr/bin']
- exc, arg = (ENOENT, 'No such file or directory')
+ 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:
execv(fullname, args)
except error, (errno, msg):
- if errno != ENOENT:
+ 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