]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merge changes
authorGuido van Rossum <guido@python.org>
Mon, 1 Aug 1994 11:18:30 +0000 (11:18 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 1 Aug 1994 11:18:30 +0000 (11:18 +0000)
Lib/os.py

index bb90f2eed59fe0609e1d634392f773f3496f166f..dda32135669e26d4e49897a6bd038ce0266f84db 100644 (file)
--- 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
 # 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