1 r"""OS routines for Mac, DOS, NT, or Posix depending on what system we're on.
4 - all functions from posix, nt, dos, os2, mac, or ce, e.g. unlink, stat, etc.
5 - os.path is one of the modules posixpath, ntpath, macpath, or dospath
6 - os.name is 'posix', 'nt', 'dos', 'os2', 'mac', 'ce' or 'riscos'
7 - 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 '\\')
10 - os.extsep is the extension separator ('.' or '/')
11 - os.altsep is the alternate pathname separator (None or '/')
12 - os.pathsep is the component separator used in $PATH etc
13 - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
14 - os.defpath is the default search path for executables
16 Programs that import and use 'os' stand a better chance of being
17 portable between different platforms. Of course, they must then
18 only use functions that are defined by all platforms (e.g., unlink
19 and opendir), and leave all pathname manipulation to os.path
20 (e.g., split and join).
27 _names = sys.builtin_module_names
31 __all__ = [
"altsep",
"curdir",
"pardir",
"sep",
"pathsep",
"linesep",
34 def _get_exports_list(module):
36 return list(module.__all__)
37 except AttributeError:
38 return [n
for n
in dir(module)
if n[0] !=
'_']
43 curdir =
'.'; pardir =
'..'; sep =
'/'; pathsep =
':'
44 defpath =
':/bin:/usr/bin'
47 from posix
import _exit
55 __all__.extend(_get_exports_list(posix))
61 curdir =
'.'; pardir =
'..'; sep =
'\\'; pathsep =
';'
66 exec
"from nt import " + i
74 __all__.extend(_get_exports_list(nt))
80 curdir =
'.'; pardir =
'..'; sep =
'\\'; pathsep =
';'
92 __all__.extend(_get_exports_list(dos))
98 curdir =
'.'; pardir =
'..'; sep =
'\\'; pathsep =
';'
102 from os2
import _exit
110 __all__.extend(_get_exports_list(os2))
113 elif 'mac' in _names:
116 curdir =
':'; pardir =
'::'; sep =
':'; pathsep =
'\n'
120 from mac
import _exit
128 __all__.extend(_get_exports_list(mac))
134 curdir =
'.'; pardir =
'..'; sep =
'\\'; pathsep =
';'
135 defpath =
'\\Windows'
139 exec
"from ce import " + i
148 __all__.extend(_get_exports_list(ce))
151 elif 'riscos' in _names:
154 curdir =
'@'; pardir =
'^'; sep =
'.'; pathsep =
','
155 defpath =
'<Run$Dir>'
158 from riscos
import _exit
166 __all__.extend(_get_exports_list(riscos))
170 raise ImportError,
'no os specific module found'
178 __all__.append(
"path")
182 sys.modules[
'os.path'] = path
190 """makedirs(path [, mode=0777]) -> None
192 Super-mkdir; create a leaf directory and all intermediate ones.
193 Works like mkdir, except that any intermediate path segment (not
194 just the rightmost) will be created if it does not exist. This is
198 head, tail = path.split(name)
200 head, tail = path.split(head)
201 if head
and tail
and not path.exists(head):
206 """removedirs(path) -> None
208 Super-rmdir; remove a leaf directory and empty all intermediate
209 ones. Works like rmdir except that, if the leaf directory is
210 successfully removed, directories corresponding to rightmost path
211 segments will be pruned way until either the whole path is
212 consumed or an error occurs. Errors during this latter phase are
213 ignored -- they generally mean that a directory was not empty.
217 head, tail = path.split(name)
219 head, tail = path.split(head)
225 head, tail = path.split(head)
228 """renames(old, new) -> None
230 Super-rename; create directories as necessary and delete any left
231 empty. Works like rename, except creation of any intermediate
232 directories needed to make the new pathname good is attempted
233 first. After the rename, directories corresponding to rightmost
234 path segments of the old name will be pruned way until either the
235 whole path is consumed or a nonempty directory is found.
237 Note: this function can fail with the new directory structure made
238 if you lack permissions needed to unlink the leaf directory or
242 head, tail = path.split(new)
243 if head
and tail
and not path.exists(head):
246 head, tail = path.split(old)
253 __all__.extend([
"makedirs",
"removedirs",
"renames"])
262 """execl(file, *args)
264 Execute the executable file with argument list args, replacing the
269 """execle(file, *args, env)
271 Execute the executable file with argument list args and
272 environment env, replacing the current process. """
274 execve(file, args[:-1], env)
277 """execlp(file, *args)
279 Execute the executable file (which is searched for along $PATH)
280 with argument list args, replacing the current process. """
284 """execlpe(file, *args, env)
286 Execute the executable file (which is searched for along $PATH)
287 with argument list args and environment env, replacing the current
295 Execute the executable file (which is searched for along $PATH)
296 with argument list args, replacing the current process.
297 args may be a list or tuple of strings. """
301 """execv(file, args, env)
303 Execute the executable file (which is searched for along $PATH)
304 with argument list args and environment env , replacing the
306 args may be a list or tuple of strings. """
307 _execvpe(file, args, env)
309 __all__.extend([
"execl",
"execle",
"execlp",
"execlpe",
"execvp",
"execvpe"])
312 def _execvpe(file, args, env=None):
315 argrest = (args, env)
321 head, tail = path.split(file)
323 apply(func, (file,) + argrest)
325 if env.has_key(
'PATH'):
326 envpath = env[
'PATH']
329 PATH = envpath.split(pathsep)
331 if sys.platform[:4] ==
'beos':
336 try: unlink(
'/_#.# ## #.#')
337 except error, _notfound:
pass
342 try: execv(t, (
'blah',))
343 except error, _notfound:
pass
344 exc, arg = error, _notfound
346 fullname = path.join(dir, file)
348 apply(func, (fullname,) + argrest)
349 except error, (errno, msg):
351 exc, arg = error, (errno, msg)
368 if name
in (
'os2',
'nt',
'dos'):
374 from riscosenviron
import _Environ
375 elif name
in (
'os2',
'nt',
'dos'):
381 for k, v
in environ.items():
385 self.
data[key.upper()] = item
387 return self.
data[key.upper()]
392 del self.
data[key.upper()]
396 del self.
data[key.upper()]
398 return self.data.has_key(key.upper())
399 def get(self, key, failobj=None):
400 return self.data.get(key.upper(), failobj)
402 for k, v
in dict.items():
412 self.
data[key] = item
414 for k, v
in dict.items():
429 """Get an environment variable, return None if it doesn't exist.
430 The optional second argument can specify an alternate default."""
431 return environ.get(key, default)
432 __all__.append(
"getenv")
442 if _exists(
"fork")
and not _exists(
"spawnv")
and _exists(
"execv"):
445 P_NOWAIT = P_NOWAITO = 1
451 def _spawnvef(mode, file, args, env, func):
460 func(file, args, env)
468 wpid, sts = waitpid(pid, 0)
471 elif WIFSIGNALED(sts):
472 return -WTERMSIG(sts)
474 return WEXITSTATUS(sts)
476 raise error,
"Not stopped, signaled or exited???"
479 """spawnv(mode, file, args) -> integer
481 Execute file with arguments from args in a subprocess.
482 If mode == P_NOWAIT return the pid of the process.
483 If mode == P_WAIT return the process's exit code if it exits normally;
484 otherwise return -SIG, where SIG is the signal that killed it. """
485 return _spawnvef(mode, file, args,
None, execv)
488 """spawnve(mode, file, args, env) -> integer
490 Execute file with arguments from args in a subprocess with the
491 specified environment.
492 If mode == P_NOWAIT return the pid of the process.
493 If mode == P_WAIT return the process's exit code if it exits normally;
494 otherwise return -SIG, where SIG is the signal that killed it. """
495 return _spawnvef(mode, file, args, env, execve)
500 """spawnvp(mode, file, args) -> integer
502 Execute file (which is looked for along $PATH) with arguments from
503 args in a subprocess.
504 If mode == P_NOWAIT return the pid of the process.
505 If mode == P_WAIT return the process's exit code if it exits normally;
506 otherwise return -SIG, where SIG is the signal that killed it. """
507 return _spawnvef(mode, file, args,
None, execvp)
510 """spawnvpe(mode, file, args, env) -> integer
512 Execute file (which is looked for along $PATH) with arguments from
513 args in a subprocess with the supplied environment.
514 If mode == P_NOWAIT return the pid of the process.
515 If mode == P_WAIT return the process's exit code if it exits normally;
516 otherwise return -SIG, where SIG is the signal that killed it. """
517 return _spawnvef(mode, file, args, env, execvpe)
519 if _exists(
"spawnv"):
524 """spawnl(mode, file, *args) -> integer
526 Execute file with arguments from args in a subprocess.
527 If mode == P_NOWAIT return the pid of the process.
528 If mode == P_WAIT return the process's exit code if it exits normally;
529 otherwise return -SIG, where SIG is the signal that killed it. """
530 return spawnv(mode, file, args)
533 """spawnle(mode, file, *args, env) -> integer
535 Execute file with arguments from args in a subprocess with the
536 supplied environment.
537 If mode == P_NOWAIT return the pid of the process.
538 If mode == P_WAIT return the process's exit code if it exits normally;
539 otherwise return -SIG, where SIG is the signal that killed it. """
541 return spawnve(mode, file, args[:-1], env)
543 if _exists(
"spawnvp"):
547 """spawnlp(mode, file, *args, env) -> integer
549 Execute file (which is looked for along $PATH) with arguments from
550 args in a subprocess with the supplied environment.
551 If mode == P_NOWAIT return the pid of the process.
552 If mode == P_WAIT return the process's exit code if it exits normally;
553 otherwise return -SIG, where SIG is the signal that killed it. """
554 return spawnvp(mode, file, args)
557 """spawnlpe(mode, file, *args, env) -> integer
559 Execute file (which is looked for along $PATH) with arguments from
560 args in a subprocess with the supplied environment.
561 If mode == P_NOWAIT return the pid of the process.
562 If mode == P_WAIT return the process's exit code if it exits normally;
563 otherwise return -SIG, where SIG is the signal that killed it. """
565 return spawnvpe(mode, file, args[:-1], env)
568 __all__.extend([
"spawnlp",
"spawnlpe",
"spawnv",
"spawnve",
"spawnvp",
569 "spawnvpe",
"spawnl",
"spawnle",])
574 if not _exists(
"popen2"):
579 __all__.append(
"popen2")
581 if not _exists(
"popen3"):
585 return stdin, stdout, stderr
586 __all__.append(
"popen3")
588 if not _exists(
"popen4"):
593 __all__.append(
"popen4")
595 import copy_reg
as _copy_reg
597 def _make_stat_result(tup, dict):
598 return stat_result(tup, dict)
600 def _pickle_stat_result(sr):
601 (type, args) = sr.__reduce__()
602 return (_make_stat_result, args)
605 _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
609 def _make_statvfs_result(tup, dict):
610 return statvfs_result(tup, dict)
612 def _pickle_statvfs_result(sr):
613 (type, args) = sr.__reduce__()
614 return (_make_statvfs_result, args)
617 _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
618 _make_statvfs_result)