summaryrefslogtreecommitdiffstats
path: root/Lib/os.py
blob: 51e8a67fca56277f968f24a93231ca2388ddda31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# os.py -- either mac, dos or posix depending on what system we're on.

# This exports:
# - all functions from either posix or mac, e.g., os.unlink, os.stat, etc.
# - os.path is either module posixpath or macpath
# - os.name is either 'posix' or 'mac'
# - 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
# only use functions that are defined by all platforms (e.g., unlink
# and opendir), and leave all pathname manipulation to os.path
# (e.g., split and join).

_osindex = {
	  'posix': ('.', '..', '/', ':', ':/bin:/usr/bin'),
	  'dos':   ('.', '..', '\\', ';', '.;C:\\bin'),
	  'nt':    ('.', '..', '\\', ';', '.;C:\\bin'),
	  'mac':   (':', '::', ':', '\n', ':'),
}

# For freeze.py script:
if 0:
	import posix
	import posixpath

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
		try:
			environ
		except:
			environ = {} # Make sure os.environ exists, at least
		break
else:
	del name
	raise ImportError, 'no os specific module found'

def execl(file, *args):
	execv(file, args)

def execle(file, *args):
	env = args[-1]
	execve(file, args[:-1], env)

def execlp(file, *args):
	execvp(file, args)

def execlpe(file, *args):
	env = args[-1]
	execvpe(file, args[:-1], env)

def execvp(file, args):
	_execvpe(file, args)

def execvpe(file, args, env):
	_execvpe(file, args, env)

_notfound = None
def _execvpe(file, args, env = None):
	if env:
		func = execve
		argrest = (args, env)
	else:
		func = execv
		argrest = (args,)
		env = environ
	global _notfound
	head, tail = path.split(file)
	if head:
		apply(func, (file,) + argrest)
		return
	if env.has_key('PATH'):
		envpath = env['PATH']
	else:
		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:
			apply(func, (fullname,) + argrest)
		except error, (errno, msg):
			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


# Change environ to automatically call putenv() if it exists
try:
	_putenv = putenv
except NameError:
	_putenv = None
if _putenv:
	import UserDict

	class _Environ(UserDict.UserDict):
		def __init__(self, environ):
			UserDict.UserDict.__init__(self)
			self.data = environ
		def __setitem__(self, key, item):
			putenv(key, item)
			self.data[key] = item

	environ = _Environ(environ)