blob: 6f7e3ed5e7b0389e6873226213b73b3fd08d2696 [file] [log] [blame]
Guido van Rossumdd8cb441993-12-29 15:33:08 +00001# os.py -- either mac, dos or posix depending on what system we're on.
Guido van Rossum31104f41992-01-14 18:28:36 +00002
3# This exports:
4# - all functions from either posix or mac, e.g., os.unlink, os.stat, etc.
Guido van Rossum1a76ef21992-03-31 18:57:28 +00005# - os.path is either module posixpath or macpath
Guido van Rossum31104f41992-01-14 18:28:36 +00006# - os.name is either 'posix' or 'mac'
7# - os.curdir is a string representing the current directory ('.' or ':')
Guido van Rossum1a76ef21992-03-31 18:57:28 +00008# - os.pardir is a string representing the parent directory ('..' or '::')
Guido van Rossuma28dab51997-08-29 22:36:47 +00009# - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
10# - os.altsep is the alternatte pathname separator (None or '/')
Guido van Rossum2979b011994-08-01 11:18:30 +000011# - os.pathsep is the component separator used in $PATH etc
12# - os.defpath is the default search path for executables
Guido van Rossum31104f41992-01-14 18:28:36 +000013
14# Programs that import and use 'os' stand a better chance of being
15# portable between different platforms. Of course, they must then
16# only use functions that are defined by all platforms (e.g., unlink
17# and opendir), and leave all pathname manipulation to os.path
18# (e.g., split and join).
19
Guido van Rossum2979b011994-08-01 11:18:30 +000020import sys
Guido van Rossuma28dab51997-08-29 22:36:47 +000021
22_names = sys.builtin_module_names
23
24altsep = None
25
26if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000027 name = 'posix'
28 curdir = '.'; pardir = '..'; sep = '/'; pathsep = ':'
29 defpath = ':/bin:/usr/bin'
30 from posix import *
31 try:
32 from posix import _exit
33 except ImportError:
34 pass
35 import posixpath
36 path = posixpath
37 del posixpath
Guido van Rossuma28dab51997-08-29 22:36:47 +000038elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000039 name = 'nt'
40 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
41 defpath = '.;C:\\bin'
42 from nt import *
43 try:
44 from nt import _exit
45 except ImportError:
46 pass
47 import ntpath
48 path = ntpath
49 del ntpath
Guido van Rossuma28dab51997-08-29 22:36:47 +000050elif 'dos' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000051 name = 'dos'
52 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
53 defpath = '.;C:\\bin'
54 from dos import *
55 try:
56 from dos import _exit
57 except ImportError:
58 pass
59 import dospath
60 path = dospath
61 del dospath
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000062elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000063 name = 'os2'
64 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
65 defpath = '.;C:\\bin'
66 from os2 import *
67 try:
68 from os2 import _exit
69 except ImportError:
70 pass
71 import ntpath
72 path = ntpath
73 del ntpath
Guido van Rossuma28dab51997-08-29 22:36:47 +000074elif 'mac' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000075 name = 'mac'
76 curdir = ':'; pardir = '::'; sep = ':'; pathsep = '\n'
77 defpath = ':'
78 from mac import *
79 try:
80 from mac import _exit
81 except ImportError:
82 pass
83 import macpath
84 path = macpath
85 del macpath
Guido van Rossum2979b011994-08-01 11:18:30 +000086else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000087 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +000088
Guido van Rossuma28dab51997-08-29 22:36:47 +000089del _names
90
91# Make sure os.environ exists, at least
92try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000093 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +000094except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000095 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +000096
Guido van Rossume65cce51993-11-08 15:05:21 +000097def execl(file, *args):
Guido van Rossum61de0ac1997-12-05 21:24:30 +000098 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +000099
100def execle(file, *args):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000101 env = args[-1]
102 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000103
104def execlp(file, *args):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000105 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000106
Guido van Rossum030afb11995-03-14 17:27:18 +0000107def execlpe(file, *args):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000108 env = args[-1]
109 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000110
Guido van Rossume65cce51993-11-08 15:05:21 +0000111def execvp(file, args):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000112 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000113
114def execvpe(file, args, env):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000115 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000116
117_notfound = None
118def _execvpe(file, args, env = None):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000119 if env:
120 func = execve
121 argrest = (args, env)
122 else:
123 func = execv
124 argrest = (args,)
125 env = environ
126 global _notfound
127 head, tail = path.split(file)
128 if head:
129 apply(func, (file,) + argrest)
130 return
131 if env.has_key('PATH'):
132 envpath = env['PATH']
133 else:
134 envpath = defpath
135 import string
136 PATH = string.splitfields(envpath, pathsep)
137 if not _notfound:
138 import tempfile
139 # Exec a file that is guaranteed not to exist
140 try: execv(tempfile.mktemp(), ())
141 except error, _notfound: pass
142 exc, arg = error, _notfound
143 for dir in PATH:
144 fullname = path.join(dir, file)
145 try:
146 apply(func, (fullname,) + argrest)
147 except error, (errno, msg):
148 if errno != arg[0]:
149 exc, arg = error, (errno, msg)
150 raise exc, arg
Guido van Rossum2979b011994-08-01 11:18:30 +0000151
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000152# Change environ to automatically call putenv() if it exists
153try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000154 # This will fail if there's no putenv
155 putenv
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000156except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000157 pass
Guido van Rossuma28dab51997-08-29 22:36:47 +0000158else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000159 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000160
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000161 if name in ('os2', ): # Where Env Var Names Must Be UPPERCASE
162 import string
163 class _Environ(UserDict.UserDict):
164 def __init__(self, environ):
165 UserDict.UserDict.__init__(self)
166 self.data = environ
167 def __setitem__(self, key, item):
168 key = string.upper(key)
169 putenv(key, item)
170 self.data[key] = item
171 def __getitem__(self, key):
172 return self.data[string.upper(key)]
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000173
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000174 else: # Where Env Var Names Can Be Mixed Case
175 class _Environ(UserDict.UserDict):
176 def __init__(self, environ):
177 UserDict.UserDict.__init__(self)
178 self.data = environ
179 def __getinitargs__(self):
180 import copy
181 return (copy.copy(self.data),)
182 def __setitem__(self, key, item):
183 putenv(key, item)
184 self.data[key] = item
185 def __copy__(self):
186 return _Environ(self.data.copy())
187
188 environ = _Environ(environ)