blob: 721cb7e50e529e9d76ea5e39b3fcfdd814ab857b [file] [log] [blame]
Ka-Ping Yeefeb67192001-03-02 23:31:43 +00001r"""OS routines for Mac, DOS, NT, or Posix depending on what system we're on.
Guido van Rossum31104f41992-01-14 18:28:36 +00002
Guido van Rossum54f22ed2000-02-04 15:10:34 +00003This exports:
Martin v. Löwis8b10f892002-10-09 17:23:29 +00004 - all functions from posix, nt, os2, mac, or ce, e.g. unlink, stat, etc.
5 - os.path is one of the modules posixpath, ntpath, or macpath
6 - os.name is 'posix', 'nt', 'os2', 'mac', 'ce' or 'riscos'
Guido van Rossum54f22ed2000-02-04 15:10:34 +00007 - os.curdir is a string representing the current directory ('.' or ':')
8 - os.pardir is a string representing the parent directory ('..' or '::')
9 - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
Guido van Rossume2ae77b2001-10-24 20:42:55 +000010 - os.extsep is the extension separator ('.' or '/')
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000011 - os.altsep is the alternate pathname separator (None or '/')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000012 - os.pathsep is the component separator used in $PATH etc
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +000013 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
Guido van Rossum54f22ed2000-02-04 15:10:34 +000014 - os.defpath is the default search path for executables
Guido van Rossum31104f41992-01-14 18:28:36 +000015
Guido van Rossum54f22ed2000-02-04 15:10:34 +000016Programs that import and use 'os' stand a better chance of being
17portable between different platforms. Of course, they must then
18only use functions that are defined by all platforms (e.g., unlink
19and opendir), and leave all pathname manipulation to os.path
20(e.g., split and join).
21"""
Guido van Rossum31104f41992-01-14 18:28:36 +000022
Skip Montanaro269b83b2001-02-06 01:07:02 +000023#'
24
Guido van Rossum2979b011994-08-01 11:18:30 +000025import sys
Guido van Rossuma28dab51997-08-29 22:36:47 +000026
27_names = sys.builtin_module_names
28
29altsep = None
30
Skip Montanaro6c0a0e12001-02-28 01:00:58 +000031__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
32 "defpath", "name"]
Skip Montanaro269b83b2001-02-06 01:07:02 +000033
34def _get_exports_list(module):
35 try:
36 return list(module.__all__)
37 except AttributeError:
38 return [n for n in dir(module) if n[0] != '_']
39
Guido van Rossuma28dab51997-08-29 22:36:47 +000040if 'posix' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000041 name = 'posix'
Guido van Rossume9387ea1998-05-22 15:26:04 +000042 linesep = '\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000043 curdir = '.'; pardir = '..'; sep = '/'; pathsep = ':'
44 defpath = ':/bin:/usr/bin'
45 from posix import *
46 try:
47 from posix import _exit
48 except ImportError:
49 pass
50 import posixpath
51 path = posixpath
52 del posixpath
Skip Montanaro269b83b2001-02-06 01:07:02 +000053
54 import posix
55 __all__.extend(_get_exports_list(posix))
56 del posix
57
Guido van Rossuma28dab51997-08-29 22:36:47 +000058elif 'nt' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000059 name = 'nt'
Guido van Rossume9387ea1998-05-22 15:26:04 +000060 linesep = '\r\n'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000061 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
62 defpath = '.;C:\\bin'
63 from nt import *
Guido van Rossumfb801e71999-02-22 15:40:34 +000064 for i in ['_exit']:
Guido van Rossum67c65b21999-02-01 23:52:29 +000065 try:
66 exec "from nt import " + i
67 except ImportError:
68 pass
Guido van Rossum61de0ac1997-12-05 21:24:30 +000069 import ntpath
70 path = ntpath
71 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +000072
73 import nt
74 __all__.extend(_get_exports_list(nt))
75 del nt
76
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000077elif 'os2' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +000078 name = 'os2'
Guido van Rossume9387ea1998-05-22 15:26:04 +000079 linesep = '\r\n'
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000080 curdir = '.'; pardir = '..'; pathsep = ';'
81 if sys.version.find('EMX GCC') == -1:
82 # standard OS/2 compiler (VACPP or Watcom?)
83 sep = '\\'; altsep = '/'
84 else:
85 # EMX
86 sep = '/'; altsep = '\\'
Guido van Rossum61de0ac1997-12-05 21:24:30 +000087 defpath = '.;C:\\bin'
88 from os2 import *
89 try:
90 from os2 import _exit
91 except ImportError:
92 pass
Andrew MacIntyre5cef5712002-02-24 05:32:32 +000093 if sys.version.find('EMX GCC') == -1:
94 import ntpath
95 path = ntpath
96 del ntpath
97 else:
98 import os2emxpath
99 path = os2emxpath
100 del os2emxpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000101
102 import os2
103 __all__.extend(_get_exports_list(os2))
104 del os2
105
Guido van Rossuma28dab51997-08-29 22:36:47 +0000106elif 'mac' in _names:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000107 name = 'mac'
Guido van Rossume9387ea1998-05-22 15:26:04 +0000108 linesep = '\r'
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000109 curdir = ':'; pardir = '::'; sep = ':'; pathsep = '\n'
110 defpath = ':'
111 from mac import *
112 try:
113 from mac import _exit
114 except ImportError:
115 pass
116 import macpath
117 path = macpath
118 del macpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000119
120 import mac
121 __all__.extend(_get_exports_list(mac))
122 del mac
123
Guido van Rossum18df5d41999-06-11 01:37:27 +0000124elif 'ce' in _names:
125 name = 'ce'
126 linesep = '\r\n'
127 curdir = '.'; pardir = '..'; sep = '\\'; pathsep = ';'
128 defpath = '\\Windows'
129 from ce import *
130 for i in ['_exit']:
131 try:
132 exec "from ce import " + i
133 except ImportError:
134 pass
135 # We can use the standard Windows path.
136 import ntpath
137 path = ntpath
138 del ntpath
Skip Montanaro269b83b2001-02-06 01:07:02 +0000139
140 import ce
141 __all__.extend(_get_exports_list(ce))
142 del ce
143
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000144elif 'riscos' in _names:
145 name = 'riscos'
146 linesep = '\n'
147 curdir = '@'; pardir = '^'; sep = '.'; pathsep = ','
148 defpath = '<Run$Dir>'
149 from riscos import *
150 try:
151 from riscos import _exit
152 except ImportError:
153 pass
154 import riscospath
155 path = riscospath
156 del riscospath
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000157
158 import riscos
159 __all__.extend(_get_exports_list(riscos))
Skip Montanaro81e4b1c2001-03-06 15:26:07 +0000160 del riscos
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000161
Guido van Rossum2979b011994-08-01 11:18:30 +0000162else:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000163 raise ImportError, 'no os specific module found'
Guido van Rossume65cce51993-11-08 15:05:21 +0000164
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000165
166if sep=='.':
167 extsep = '/'
168else:
169 extsep = '.'
170
Skip Montanaro269b83b2001-02-06 01:07:02 +0000171__all__.append("path")
172
Guido van Rossuma28dab51997-08-29 22:36:47 +0000173del _names
174
Fred Drake02379091999-01-19 16:05:13 +0000175sys.modules['os.path'] = path
176
Skip Montanaro269b83b2001-02-06 01:07:02 +0000177#'
178
Guido van Rossum4def7de1998-07-24 20:48:03 +0000179# Super directory utilities.
180# (Inspired by Eric Raymond; the doc strings are mostly his)
181
182def makedirs(name, mode=0777):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000183 """makedirs(path [, mode=0777])
Guido van Rossum4def7de1998-07-24 20:48:03 +0000184
185 Super-mkdir; create a leaf directory and all intermediate ones.
186 Works like mkdir, except that any intermediate path segment (not
187 just the rightmost) will be created if it does not exist. This is
188 recursive.
189
190 """
191 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000192 if not tail:
193 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000194 if head and tail and not path.exists(head):
195 makedirs(head, mode)
196 mkdir(name, mode)
197
198def removedirs(name):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000199 """removedirs(path)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000200
201 Super-rmdir; remove a leaf directory and empty all intermediate
202 ones. Works like rmdir except that, if the leaf directory is
203 successfully removed, directories corresponding to rightmost path
204 segments will be pruned way until either the whole path is
205 consumed or an error occurs. Errors during this latter phase are
206 ignored -- they generally mean that a directory was not empty.
207
208 """
209 rmdir(name)
210 head, tail = path.split(name)
Fred Drake9f2550f2000-07-25 15:16:40 +0000211 if not tail:
212 head, tail = path.split(head)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000213 while head and tail:
214 try:
215 rmdir(head)
216 except error:
217 break
218 head, tail = path.split(head)
219
220def renames(old, new):
Fred Drakecadb9eb2002-07-02 21:28:04 +0000221 """renames(old, new)
Guido van Rossum4def7de1998-07-24 20:48:03 +0000222
223 Super-rename; create directories as necessary and delete any left
224 empty. Works like rename, except creation of any intermediate
225 directories needed to make the new pathname good is attempted
226 first. After the rename, directories corresponding to rightmost
227 path segments of the old name will be pruned way until either the
228 whole path is consumed or a nonempty directory is found.
229
230 Note: this function can fail with the new directory structure made
231 if you lack permissions needed to unlink the leaf directory or
232 file.
233
234 """
235 head, tail = path.split(new)
236 if head and tail and not path.exists(head):
237 makedirs(head)
238 rename(old, new)
239 head, tail = path.split(old)
240 if head and tail:
241 try:
242 removedirs(head)
243 except error:
244 pass
245
Skip Montanaro269b83b2001-02-06 01:07:02 +0000246__all__.extend(["makedirs", "removedirs", "renames"])
247
Guido van Rossuma28dab51997-08-29 22:36:47 +0000248# Make sure os.environ exists, at least
249try:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000250 environ
Guido van Rossuma28dab51997-08-29 22:36:47 +0000251except NameError:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000252 environ = {}
Guido van Rossuma28dab51997-08-29 22:36:47 +0000253
Guido van Rossume65cce51993-11-08 15:05:21 +0000254def execl(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000255 """execl(file, *args)
256
257 Execute the executable file with argument list args, replacing the
258 current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000259 execv(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000260
261def execle(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000262 """execle(file, *args, env)
263
264 Execute the executable file with argument list args and
265 environment env, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000266 env = args[-1]
267 execve(file, args[:-1], env)
Guido van Rossume65cce51993-11-08 15:05:21 +0000268
269def execlp(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000270 """execlp(file, *args)
271
272 Execute the executable file (which is searched for along $PATH)
273 with argument list args, replacing the current process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000274 execvp(file, args)
Guido van Rossume65cce51993-11-08 15:05:21 +0000275
Guido van Rossum030afb11995-03-14 17:27:18 +0000276def execlpe(file, *args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000277 """execlpe(file, *args, env)
278
279 Execute the executable file (which is searched for along $PATH)
280 with argument list args and environment env, replacing the current
Tim Peters2344fae2001-01-15 00:50:52 +0000281 process. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000282 env = args[-1]
283 execvpe(file, args[:-1], env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000284
Guido van Rossume65cce51993-11-08 15:05:21 +0000285def execvp(file, args):
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000286 """execp(file, args)
287
288 Execute the executable file (which is searched for along $PATH)
289 with argument list args, replacing the current process.
Thomas Wouters7e474022000-07-16 12:04:32 +0000290 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000291 _execvpe(file, args)
Guido van Rossum030afb11995-03-14 17:27:18 +0000292
293def execvpe(file, args, env):
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000294 """execvpe(file, args, env)
Guido van Rossum7da3cc52000-04-25 10:53:22 +0000295
296 Execute the executable file (which is searched for along $PATH)
297 with argument list args and environment env , replacing the
298 current process.
Tim Peters2344fae2001-01-15 00:50:52 +0000299 args may be a list or tuple of strings. """
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000300 _execvpe(file, args, env)
Guido van Rossum030afb11995-03-14 17:27:18 +0000301
Skip Montanaro269b83b2001-02-06 01:07:02 +0000302__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
303
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000304def _execvpe(file, args, env=None):
Guido van Rossumaed51d82002-08-05 16:13:24 +0000305 from errno import ENOENT, ENOTDIR
306
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000307 if env is not None:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000308 func = execve
309 argrest = (args, env)
310 else:
311 func = execv
312 argrest = (args,)
313 env = environ
Guido van Rossumaed51d82002-08-05 16:13:24 +0000314
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000315 head, tail = path.split(file)
316 if head:
317 apply(func, (file,) + argrest)
318 return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000319 if 'PATH' in env:
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000320 envpath = env['PATH']
321 else:
322 envpath = defpath
Guido van Rossum965fdae2000-04-04 19:50:04 +0000323 PATH = envpath.split(pathsep)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000324 saved_exc = None
325 saved_tb = None
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000326 for dir in PATH:
327 fullname = path.join(dir, file)
328 try:
329 apply(func, (fullname,) + argrest)
Guido van Rossum683c0fe2002-09-03 16:36:17 +0000330 except error, e:
331 tb = sys.exc_info()[2]
332 if (e.errno != ENOENT and e.errno != ENOTDIR
333 and saved_exc is None):
334 saved_exc = e
335 saved_tb = tb
336 if saved_exc:
337 raise error, saved_exc, saved_tb
338 raise error, e, tb
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000339
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000340# Change environ to automatically call putenv() if it exists
341try:
342 # This will fail if there's no putenv
343 putenv
344except NameError:
345 pass
346else:
347 import UserDict
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000348
Guido van Rossumc524d952001-10-19 01:31:59 +0000349 # Fake unsetenv() for Windows
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000350 # not sure about os2 here but
Guido van Rossumc524d952001-10-19 01:31:59 +0000351 # I'm guessing they are the same.
352
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000353 if name in ('os2', 'nt'):
Guido van Rossumc524d952001-10-19 01:31:59 +0000354 def unsetenv(key):
355 putenv(key, "")
356
Martin v. Löwisa90f4382001-03-07 09:05:45 +0000357 if name == "riscos":
358 # On RISC OS, all env access goes through getenv and putenv
359 from riscosenviron import _Environ
Martin v. Löwis8b10f892002-10-09 17:23:29 +0000360 elif name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000361 # But we store them as upper case
Raymond Hettingerca2f5372002-09-06 19:36:31 +0000362 class _Environ(UserDict.IterableUserDict):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000363 def __init__(self, environ):
364 UserDict.UserDict.__init__(self)
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000365 data = self.data
Guido van Rossumda4d6da1998-08-04 16:01:23 +0000366 for k, v in environ.items():
Guido van Rossum965fdae2000-04-04 19:50:04 +0000367 data[k.upper()] = v
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000368 def __setitem__(self, key, item):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000369 putenv(key, item)
Guido van Rossum965fdae2000-04-04 19:50:04 +0000370 self.data[key.upper()] = item
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000371 def __getitem__(self, key):
Guido van Rossum965fdae2000-04-04 19:50:04 +0000372 return self.data[key.upper()]
Guido van Rossumc524d952001-10-19 01:31:59 +0000373 try:
374 unsetenv
375 except NameError:
376 def __delitem__(self, key):
377 del self.data[key.upper()]
378 else:
379 def __delitem__(self, key):
380 unsetenv(key)
381 del self.data[key.upper()]
Guido van Rossumb46413f1999-05-03 15:23:24 +0000382 def has_key(self, key):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000383 return key.upper() in self.data
384 def __contains__(self, key):
385 return key.upper() in self.data
Guido van Rossum965fdae2000-04-04 19:50:04 +0000386 def get(self, key, failobj=None):
387 return self.data.get(key.upper(), failobj)
388 def update(self, dict):
389 for k, v in dict.items():
390 self[k] = v
Martin v. Löwisa066f462002-05-02 17:39:19 +0000391 def copy(self):
392 return dict(self)
Guido van Rossum3b8e20d1996-07-24 00:55:17 +0000393
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000394 else: # Where Env Var Names Can Be Mixed Case
Raymond Hettinger05212fc2002-09-07 04:48:03 +0000395 class _Environ(UserDict.IterableUserDict):
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000396 def __init__(self, environ):
397 UserDict.UserDict.__init__(self)
398 self.data = environ
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000399 def __setitem__(self, key, item):
400 putenv(key, item)
401 self.data[key] = item
Guido van Rossum965fdae2000-04-04 19:50:04 +0000402 def update(self, dict):
403 for k, v in dict.items():
404 self[k] = v
Guido van Rossumc524d952001-10-19 01:31:59 +0000405 try:
406 unsetenv
407 except NameError:
408 pass
409 else:
410 def __delitem__(self, key):
411 unsetenv(key)
412 del self.data[key]
Martin v. Löwisa066f462002-05-02 17:39:19 +0000413 def copy(self):
414 return dict(self)
Tim Peters1633a2e2001-10-30 05:56:40 +0000415
Guido van Rossum61de0ac1997-12-05 21:24:30 +0000416
417 environ = _Environ(environ)
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000418
Guido van Rossumd74fb6b2001-03-02 06:43:49 +0000419 def getenv(key, default=None):
420 """Get an environment variable, return None if it doesn't exist.
421 The optional second argument can specify an alternate default."""
422 return environ.get(key, default)
423 __all__.append("getenv")
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000424
425def _exists(name):
426 try:
427 eval(name)
Tim Petersbc0e9102002-04-04 22:55:58 +0000428 return True
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000429 except NameError:
Tim Petersbc0e9102002-04-04 22:55:58 +0000430 return False
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000431
432# Supply spawn*() (probably only for Unix)
433if _exists("fork") and not _exists("spawnv") and _exists("execv"):
434
435 P_WAIT = 0
436 P_NOWAIT = P_NOWAITO = 1
437
438 # XXX Should we support P_DETACH? I suppose it could fork()**2
439 # and close the std I/O streams. Also, P_OVERLAY is the same
440 # as execv*()?
441
442 def _spawnvef(mode, file, args, env, func):
443 # Internal helper; func is the exec*() function to use
444 pid = fork()
445 if not pid:
446 # Child
447 try:
448 if env is None:
449 func(file, args)
450 else:
451 func(file, args, env)
452 except:
453 _exit(127)
454 else:
455 # Parent
456 if mode == P_NOWAIT:
457 return pid # Caller is responsible for waiting!
458 while 1:
459 wpid, sts = waitpid(pid, 0)
460 if WIFSTOPPED(sts):
461 continue
462 elif WIFSIGNALED(sts):
463 return -WTERMSIG(sts)
464 elif WIFEXITED(sts):
465 return WEXITSTATUS(sts)
466 else:
467 raise error, "Not stopped, signaled or exited???"
468
469 def spawnv(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000470 """spawnv(mode, file, args) -> integer
471
472Execute file with arguments from args in a subprocess.
473If mode == P_NOWAIT return the pid of the process.
474If mode == P_WAIT return the process's exit code if it exits normally;
Tim Peters2344fae2001-01-15 00:50:52 +0000475otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000476 return _spawnvef(mode, file, args, None, execv)
477
478 def spawnve(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000479 """spawnve(mode, file, args, env) -> integer
480
481Execute file with arguments from args in a subprocess with the
482specified environment.
483If mode == P_NOWAIT return the pid of the process.
484If mode == P_WAIT return the process's exit code if it exits normally;
485otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000486 return _spawnvef(mode, file, args, env, execve)
487
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000488 # Note: spawnvp[e] is't currently supported on Windows
489
490 def spawnvp(mode, file, args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000491 """spawnvp(mode, file, args) -> integer
492
493Execute file (which is looked for along $PATH) with arguments from
494args in a subprocess.
495If mode == P_NOWAIT return the pid of the process.
496If mode == P_WAIT return the process's exit code if it exits normally;
497otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000498 return _spawnvef(mode, file, args, None, execvp)
499
500 def spawnvpe(mode, file, args, env):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000501 """spawnvpe(mode, file, args, env) -> integer
502
503Execute file (which is looked for along $PATH) with arguments from
504args in a subprocess with the supplied environment.
505If mode == P_NOWAIT return the pid of the process.
506If mode == P_WAIT return the process's exit code if it exits normally;
507otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000508 return _spawnvef(mode, file, args, env, execvpe)
509
510if _exists("spawnv"):
511 # These aren't supplied by the basic Windows code
512 # but can be easily implemented in Python
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000513
514 def spawnl(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000515 """spawnl(mode, file, *args) -> integer
516
517Execute file with arguments from args in a subprocess.
518If mode == P_NOWAIT return the pid of the process.
519If mode == P_WAIT return the process's exit code if it exits normally;
520otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000521 return spawnv(mode, file, args)
522
523 def spawnle(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000524 """spawnle(mode, file, *args, env) -> integer
525
526Execute file with arguments from args in a subprocess with the
527supplied environment.
528If mode == P_NOWAIT return the pid of the process.
529If mode == P_WAIT return the process's exit code if it exits normally;
530otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000531 env = args[-1]
532 return spawnve(mode, file, args[:-1], env)
533
Guido van Rossumdd7cbbf1999-11-02 20:44:07 +0000534if _exists("spawnvp"):
535 # At the moment, Windows doesn't implement spawnvp[e],
536 # so it won't have spawnlp[e] either.
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000537 def spawnlp(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000538 """spawnlp(mode, file, *args, env) -> integer
539
540Execute file (which is looked for along $PATH) with arguments from
541args in a subprocess with the supplied environment.
542If mode == P_NOWAIT return the pid of the process.
543If mode == P_WAIT return the process's exit code if it exits normally;
544otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000545 return spawnvp(mode, file, args)
546
547 def spawnlpe(mode, file, *args):
Guido van Rossume0cd2912000-04-21 18:35:36 +0000548 """spawnlpe(mode, file, *args, env) -> integer
549
550Execute file (which is looked for along $PATH) with arguments from
551args in a subprocess with the supplied environment.
552If mode == P_NOWAIT return the pid of the process.
553If mode == P_WAIT return the process's exit code if it exits normally;
554otherwise return -SIG, where SIG is the signal that killed it. """
Guido van Rossum5a2ca931999-11-02 13:27:32 +0000555 env = args[-1]
556 return spawnvpe(mode, file, args[:-1], env)
Guido van Rossume0cd2912000-04-21 18:35:36 +0000557
558
Skip Montanaro269b83b2001-02-06 01:07:02 +0000559 __all__.extend(["spawnlp","spawnlpe","spawnv", "spawnve","spawnvp",
560 "spawnvpe","spawnl","spawnle",])
561
562
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000563# Supply popen2 etc. (for Unix)
564if _exists("fork"):
565 if not _exists("popen2"):
566 def popen2(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000567 import popen2
568 stdout, stdin = popen2.popen2(cmd, bufsize)
569 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000570 __all__.append("popen2")
Fred Drake31f182e2000-08-28 17:20:05 +0000571
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000572 if not _exists("popen3"):
573 def popen3(cmd, mode="t", bufsize=-1):
Guido van Rossumd9a8e962000-09-19 03:04:52 +0000574 import popen2
575 stdout, stdin, stderr = popen2.popen3(cmd, bufsize)
576 return stdin, stdout, stderr
Skip Montanaro269b83b2001-02-06 01:07:02 +0000577 __all__.append("popen3")
Fred Drake20af3172000-09-28 19:10:56 +0000578
579 if not _exists("popen4"):
580 def popen4(cmd, mode="t", bufsize=-1):
581 import popen2
582 stdout, stdin = popen2.popen4(cmd, bufsize)
583 return stdin, stdout
Skip Montanaro269b83b2001-02-06 01:07:02 +0000584 __all__.append("popen4")
Michael W. Hudson0e025302002-03-06 17:11:18 +0000585
586import copy_reg as _copy_reg
587
588def _make_stat_result(tup, dict):
589 return stat_result(tup, dict)
590
591def _pickle_stat_result(sr):
592 (type, args) = sr.__reduce__()
593 return (_make_stat_result, args)
594
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000595try:
596 _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
597except NameError: # stat_result may not exist
598 pass
Michael W. Hudson0e025302002-03-06 17:11:18 +0000599
600def _make_statvfs_result(tup, dict):
601 return statvfs_result(tup, dict)
602
603def _pickle_statvfs_result(sr):
604 (type, args) = sr.__reduce__()
605 return (_make_statvfs_result, args)
606
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000607try:
608 _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
609 _make_statvfs_result)
Michael W. Hudsone5363b72002-03-15 10:21:59 +0000610except NameError: # statvfs_result may not exist
Michael W. Hudsonce00b732002-03-15 10:18:58 +0000611 pass