blob: 1f0d14539fc0e9545b1d997bc1ad387caf607862 [file] [log] [blame]
Fred Drake70b014d2001-07-18 18:39:56 +00001"""Provide access to Python's configuration information. The specific
2configuration variables available depend heavily on the platform and
3configuration. The values may be retrieved using
4get_config_var(name), and the list of variables is available via
5get_config_vars().keys(). Additional convenience functions are also
6available.
Greg Ward1190ee31998-12-18 23:46:33 +00007
8Written by: Fred L. Drake, Jr.
9Email: <fdrake@acm.org>
10Initial date: 17-Dec-1998
11"""
12
Greg Ward82d71ca2000-06-03 00:44:30 +000013__revision__ = "$Id$"
Greg Ward1190ee31998-12-18 23:46:33 +000014
Greg Ward9ddaaa11999-01-06 14:46:06 +000015import os
16import re
17import string
18import sys
Greg Ward1190ee31998-12-18 23:46:33 +000019
Fred Drakec1ee39a2000-03-09 15:54:52 +000020from errors import DistutilsPlatformError
Greg Warda0ca3f22000-02-02 00:05:14 +000021
Greg Ward879f0f12000-09-15 01:15:08 +000022# These are needed in a couple of spots, so just compute them once.
Greg Wardcf6bea32000-04-10 01:15:06 +000023PREFIX = os.path.normpath(sys.prefix)
24EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
Fred Drakec1ee39a2000-03-09 15:54:52 +000025
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000026# Boolean; if it's true, we're still building Python, so
27# we use different (hard-wired) directories.
28
29python_build = 0
30
31def set_python_build():
Fred Drakec916cdc2001-08-02 20:03:12 +000032 """Set the python_build flag to true.
33
34 This means that we're building Python itself. Only called from
35 the setup.py script shipped with Python.
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000036 """
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000037 global python_build
38 python_build = 1
Fred Drakec1ee39a2000-03-09 15:54:52 +000039
Fred Drakec916cdc2001-08-02 20:03:12 +000040
Greg Wardd38e6f72000-04-10 01:17:49 +000041def get_python_inc(plat_specific=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000042 """Return the directory containing installed Python header files.
Fred Drakec1ee39a2000-03-09 15:54:52 +000043
44 If 'plat_specific' is false (the default), this is the path to the
45 non-platform-specific header files, i.e. Python.h and so on;
46 otherwise, this is the path to platform-specific header files
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000047 (namely pyconfig.h).
Fred Drakec1ee39a2000-03-09 15:54:52 +000048
Greg Wardd38e6f72000-04-10 01:17:49 +000049 If 'prefix' is supplied, use it instead of sys.prefix or
50 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakec1ee39a2000-03-09 15:54:52 +000051 """
Greg Wardd38e6f72000-04-10 01:17:49 +000052 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000053 prefix = plat_specific and EXEC_PREFIX or PREFIX
Greg Ward7d73b9e2000-03-09 03:16:05 +000054 if os.name == "posix":
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000055 if python_build:
56 return "Include/"
Greg Wardcf6bea32000-04-10 01:15:06 +000057 return os.path.join(prefix, "include", "python" + sys.version[:3])
Greg Ward7d73b9e2000-03-09 03:16:05 +000058 elif os.name == "nt":
Fred Drakec916cdc2001-08-02 20:03:12 +000059 return os.path.join(prefix, "include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000060 elif os.name == "mac":
Greg Wardcf6bea32000-04-10 01:15:06 +000061 return os.path.join(prefix, "Include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000062 else:
Fred Drake70b014d2001-07-18 18:39:56 +000063 raise DistutilsPlatformError(
64 "I don't know where Python installs its C header files "
65 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +000066
67
Greg Wardd38e6f72000-04-10 01:17:49 +000068def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000069 """Return the directory containing the Python library (standard or
Fred Drakec1ee39a2000-03-09 15:54:52 +000070 site additions).
Greg Ward7d73b9e2000-03-09 03:16:05 +000071
Fred Drakec1ee39a2000-03-09 15:54:52 +000072 If 'plat_specific' is true, return the directory containing
73 platform-specific modules, i.e. any module from a non-pure-Python
74 module distribution; otherwise, return the platform-shared library
75 directory. If 'standard_lib' is true, return the directory
76 containing standard Python library modules; otherwise, return the
77 directory for site-specific modules.
78
Greg Wardd38e6f72000-04-10 01:17:49 +000079 If 'prefix' is supplied, use it instead of sys.prefix or
80 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakec1ee39a2000-03-09 15:54:52 +000081 """
Greg Wardd38e6f72000-04-10 01:17:49 +000082 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000083 prefix = plat_specific and EXEC_PREFIX or PREFIX
Fred Drakec916cdc2001-08-02 20:03:12 +000084
Greg Ward7d73b9e2000-03-09 03:16:05 +000085 if os.name == "posix":
Greg Wardcf6bea32000-04-10 01:15:06 +000086 libpython = os.path.join(prefix,
Fred Drakec1ee39a2000-03-09 15:54:52 +000087 "lib", "python" + sys.version[:3])
Greg Ward7d73b9e2000-03-09 03:16:05 +000088 if standard_lib:
89 return libpython
90 else:
Fred Drakec1ee39a2000-03-09 15:54:52 +000091 return os.path.join(libpython, "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +000092
93 elif os.name == "nt":
94 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +000095 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +000096 else:
Greg Wardcf6bea32000-04-10 01:15:06 +000097 return prefix
Greg Ward7d73b9e2000-03-09 03:16:05 +000098
99 elif os.name == "mac":
Greg Warddc9fe8a2000-08-02 01:49:40 +0000100 if plat_specific:
Greg Ward7d73b9e2000-03-09 03:16:05 +0000101 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000102 return os.path.join(prefix, "Mac", "Plugins")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000103 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000104 raise DistutilsPlatformError(
105 "OK, where DO site-specific extensions go on the Mac?")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000106 else:
107 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000108 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000109 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000110 raise DistutilsPlatformError(
111 "OK, where DO site-specific modules go on the Mac?")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000112 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000113 raise DistutilsPlatformError(
114 "I don't know where Python installs its library "
115 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000116
Greg Ward7d73b9e2000-03-09 03:16:05 +0000117
Fred Drake70b014d2001-07-18 18:39:56 +0000118def customize_compiler(compiler):
Fred Drakec916cdc2001-08-02 20:03:12 +0000119 """Do any platform-specific customization of a CCompiler instance.
120
121 Mainly needed on Unix, so we can plug in the information that
122 varies across Unices and is stored in Python's Makefile.
Greg Wardbb7baa72000-06-25 02:09:14 +0000123 """
124 if compiler.compiler_type == "unix":
Greg Ward879f0f12000-09-15 01:15:08 +0000125 (cc, opt, ccshared, ldshared, so_ext) = \
126 get_config_vars('CC', 'OPT', 'CCSHARED', 'LDSHARED', 'SO')
Greg Wardbb7baa72000-06-25 02:09:14 +0000127
Greg Ward879f0f12000-09-15 01:15:08 +0000128 cc_cmd = cc + ' ' + opt
129 compiler.set_executables(
130 preprocessor=cc + " -E", # not always!
131 compiler=cc_cmd,
132 compiler_so=cc_cmd + ' ' + ccshared,
133 linker_so=ldshared,
134 linker_exe=cc)
135
136 compiler.shared_lib_extension = so_ext
Greg Wardbb7baa72000-06-25 02:09:14 +0000137
138
Greg Ward9ddaaa11999-01-06 14:46:06 +0000139def get_config_h_filename():
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +0000140 """Return full pathname of installed pyconfig.h file."""
Fred Drakec916cdc2001-08-02 20:03:12 +0000141 if python_build:
142 inc_dir = os.curdir
143 else:
144 inc_dir = get_python_inc(plat_specific=1)
Marc-André Lemburg7cf92fa2001-07-26 18:06:58 +0000145 if sys.version < '2.2':
146 config_h = 'config.h'
147 else:
148 # The name of the config.h file changed in 2.2
149 config_h = 'pyconfig.h'
150 return os.path.join(inc_dir, config_h)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000151
Greg Ward1190ee31998-12-18 23:46:33 +0000152
Greg Ward9ddaaa11999-01-06 14:46:06 +0000153def get_makefile_filename():
Fred Drake522af3a1999-01-06 16:28:34 +0000154 """Return full pathname of installed Makefile from the Python build."""
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +0000155 if python_build:
Neil Schemenauer84d14ba2001-01-24 17:17:20 +0000156 return './Makefile'
Fred Drakec1ee39a2000-03-09 15:54:52 +0000157 lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
158 return os.path.join(lib_dir, "config", "Makefile")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000159
Greg Ward1190ee31998-12-18 23:46:33 +0000160
Greg Ward9ddaaa11999-01-06 14:46:06 +0000161def parse_config_h(fp, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000162 """Parse a config.h-style file.
163
164 A dictionary containing name/value pairs is returned. If an
165 optional dictionary is passed in as the second argument, it is
166 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000167 """
Greg Ward9ddaaa11999-01-06 14:46:06 +0000168 if g is None:
169 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000170 define_rx = re.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n")
171 undef_rx = re.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n")
Greg Ward9ddaaa11999-01-06 14:46:06 +0000172 #
Greg Ward1190ee31998-12-18 23:46:33 +0000173 while 1:
174 line = fp.readline()
175 if not line:
176 break
177 m = define_rx.match(line)
178 if m:
179 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000180 try: v = string.atoi(v)
181 except ValueError: pass
182 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +0000183 else:
184 m = undef_rx.match(line)
185 if m:
186 g[m.group(1)] = 0
Greg Ward9ddaaa11999-01-06 14:46:06 +0000187 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000188
Greg Wardd283ce72000-09-17 00:53:02 +0000189
190# Regexes needed for parsing Makefile (and similar syntaxes,
191# like old-style Setup files).
192_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
193_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
194_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
195
Greg Ward3fff8d22000-09-15 00:03:13 +0000196def parse_makefile(fn, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000197 """Parse a Makefile-style file.
198
199 A dictionary containing name/value pairs is returned. If an
200 optional dictionary is passed in as the second argument, it is
201 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000202 """
Greg Ward3fff8d22000-09-15 00:03:13 +0000203 from distutils.text_file import TextFile
Greg Wardd283ce72000-09-17 00:53:02 +0000204 fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
Greg Ward3fff8d22000-09-15 00:03:13 +0000205
Greg Ward9ddaaa11999-01-06 14:46:06 +0000206 if g is None:
207 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000208 done = {}
209 notdone = {}
Greg Ward3fff8d22000-09-15 00:03:13 +0000210
Greg Ward1190ee31998-12-18 23:46:33 +0000211 while 1:
212 line = fp.readline()
Greg Wardd283ce72000-09-17 00:53:02 +0000213 if line is None: # eof
Greg Ward1190ee31998-12-18 23:46:33 +0000214 break
Greg Wardd283ce72000-09-17 00:53:02 +0000215 m = _variable_rx.match(line)
Greg Ward1190ee31998-12-18 23:46:33 +0000216 if m:
217 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000218 v = string.strip(v)
Greg Ward1190ee31998-12-18 23:46:33 +0000219 if "$" in v:
220 notdone[n] = v
221 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000222 try: v = string.atoi(v)
223 except ValueError: pass
Greg Ward1190ee31998-12-18 23:46:33 +0000224 done[n] = v
225
226 # do variable interpolation here
Greg Ward1190ee31998-12-18 23:46:33 +0000227 while notdone:
228 for name in notdone.keys():
229 value = notdone[name]
Greg Wardd283ce72000-09-17 00:53:02 +0000230 m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000231 if m:
232 n = m.group(1)
233 if done.has_key(n):
234 after = value[m.end():]
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000235 value = value[:m.start()] + str(done[n]) + after
Greg Ward1190ee31998-12-18 23:46:33 +0000236 if "$" in after:
237 notdone[name] = value
238 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000239 try: value = string.atoi(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000240 except ValueError:
241 done[name] = string.strip(value)
242 else:
243 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000244 del notdone[name]
245 elif notdone.has_key(n):
246 # get it on a subsequent round
247 pass
248 else:
249 done[n] = ""
250 after = value[m.end():]
251 value = value[:m.start()] + after
252 if "$" in after:
253 notdone[name] = value
254 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000255 try: value = string.atoi(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000256 except ValueError:
257 done[name] = string.strip(value)
258 else:
259 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000260 del notdone[name]
261 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000262 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000263 del notdone[name]
264
Greg Wardd283ce72000-09-17 00:53:02 +0000265 fp.close()
266
Greg Ward1190ee31998-12-18 23:46:33 +0000267 # save the results in the global dictionary
268 g.update(done)
Greg Ward9ddaaa11999-01-06 14:46:06 +0000269 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000270
271
Greg Wardd283ce72000-09-17 00:53:02 +0000272def expand_makefile_vars(s, vars):
273 """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
274 'string' according to 'vars' (a dictionary mapping variable names to
275 values). Variables not present in 'vars' are silently expanded to the
276 empty string. The variable values in 'vars' should not contain further
277 variable expansions; if 'vars' is the output of 'parse_makefile()',
278 you're fine. Returns a variable-expanded version of 's'.
279 """
280
281 # This algorithm does multiple expansion, so if vars['foo'] contains
282 # "${bar}", it will expand ${foo} to ${bar}, and then expand
283 # ${bar}... and so forth. This is fine as long as 'vars' comes from
284 # 'parse_makefile()', which takes care of such expansions eagerly,
285 # according to make's variable expansion semantics.
286
287 while 1:
288 m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
289 if m:
290 name = m.group(1)
291 (beg, end) = m.span()
292 s = s[0:beg] + vars.get(m.group(1)) + s[end:]
293 else:
294 break
295 return s
296
297
Greg Ward879f0f12000-09-15 01:15:08 +0000298_config_vars = None
299
Greg Ward9ddaaa11999-01-06 14:46:06 +0000300def _init_posix():
Fred Drake522af3a1999-01-06 16:28:34 +0000301 """Initialize the module as appropriate for POSIX systems."""
Greg Ward879f0f12000-09-15 01:15:08 +0000302 g = {}
Greg Warda0ca3f22000-02-02 00:05:14 +0000303 # load the installed Makefile:
Greg Warda570c052000-05-23 23:14:00 +0000304 try:
305 filename = get_makefile_filename()
Greg Ward3fff8d22000-09-15 00:03:13 +0000306 parse_makefile(filename, g)
Greg Warda570c052000-05-23 23:14:00 +0000307 except IOError, msg:
308 my_msg = "invalid Python installation: unable to open %s" % filename
309 if hasattr(msg, "strerror"):
310 my_msg = my_msg + " (%s)" % msg.strerror
311
Fred Drake70b014d2001-07-18 18:39:56 +0000312 raise DistutilsPlatformError(my_msg)
Fred Drakec916cdc2001-08-02 20:03:12 +0000313
314
Greg Ward4f880282000-06-27 01:59:06 +0000315 # On AIX, there are wrong paths to the linker scripts in the Makefile
316 # -- these paths are relative to the Python source, but when installed
317 # the scripts are in another directory.
Neil Schemenauer1a020862001-02-16 03:31:13 +0000318 if python_build:
Andrew M. Kuchling63357732001-02-28 19:40:27 +0000319 g['LDSHARED'] = g['BLDSHARED']
Greg Ward879f0f12000-09-15 01:15:08 +0000320
321 global _config_vars
322 _config_vars = g
Greg Ward66e966f2000-09-01 01:23:26 +0000323
Greg Ward9ddaaa11999-01-06 14:46:06 +0000324
Greg Ward4d74d731999-06-08 01:58:36 +0000325def _init_nt():
326 """Initialize the module as appropriate for NT"""
Greg Ward879f0f12000-09-15 01:15:08 +0000327 g = {}
Greg Ward4d74d731999-06-08 01:58:36 +0000328 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000329 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
330 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward4d74d731999-06-08 01:58:36 +0000331
Greg Ward32162e81999-08-29 18:22:13 +0000332 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000333 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward32162e81999-08-29 18:22:13 +0000334
Fred Drake69e2c6e2000-02-08 15:55:42 +0000335 g['SO'] = '.pyd'
Greg Ward82d71ca2000-06-03 00:44:30 +0000336 g['EXE'] = ".exe"
Greg Ward879f0f12000-09-15 01:15:08 +0000337
338 global _config_vars
339 _config_vars = g
Greg Ward82d71ca2000-06-03 00:44:30 +0000340
Fred Drake69e2c6e2000-02-08 15:55:42 +0000341
Greg Ward0eff87a2000-03-07 03:30:09 +0000342def _init_mac():
343 """Initialize the module as appropriate for Macintosh systems"""
Greg Ward879f0f12000-09-15 01:15:08 +0000344 g = {}
Greg Ward0eff87a2000-03-07 03:30:09 +0000345 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000346 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
347 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward0eff87a2000-03-07 03:30:09 +0000348
349 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000350 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward0eff87a2000-03-07 03:30:09 +0000351
Jack Jansendd13a202001-05-17 12:52:01 +0000352 import MacOS
353 if not hasattr(MacOS, 'runtimemodel'):
Guido van Rossum99f9baa2001-05-17 15:03:14 +0000354 g['SO'] = '.ppc.slb'
Jack Jansendd13a202001-05-17 12:52:01 +0000355 else:
356 g['SO'] = '.%s.slb' % MacOS.runtimemodel
Greg Ward7d73b9e2000-03-09 03:16:05 +0000357
358 # XXX are these used anywhere?
Greg Wardcf6bea32000-04-10 01:15:06 +0000359 g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib")
360 g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib")
Greg Ward0eff87a2000-03-07 03:30:09 +0000361
Greg Ward879f0f12000-09-15 01:15:08 +0000362 global _config_vars
363 _config_vars = g
Greg Ward9ddaaa11999-01-06 14:46:06 +0000364
Fred Drake69e2c6e2000-02-08 15:55:42 +0000365
Greg Ward879f0f12000-09-15 01:15:08 +0000366def get_config_vars(*args):
367 """With no arguments, return a dictionary of all configuration
368 variables relevant for the current platform. Generally this includes
369 everything needed to build extensions and install both pure modules and
370 extensions. On Unix, this means every variable defined in Python's
371 installed Makefile; on Windows and Mac OS it's a much smaller set.
372
373 With arguments, return a list of values that result from looking up
374 each argument in the configuration variable dictionary.
375 """
376 global _config_vars
377 if _config_vars is None:
Greg Ward879f0f12000-09-15 01:15:08 +0000378 func = globals().get("_init_" + os.name)
379 if func:
380 func()
381 else:
382 _config_vars = {}
383
384 # Normalized versions of prefix and exec_prefix are handy to have;
385 # in fact, these are the standard versions used most places in the
386 # Distutils.
387 _config_vars['prefix'] = PREFIX
388 _config_vars['exec_prefix'] = EXEC_PREFIX
389
390 if args:
391 vals = []
392 for name in args:
393 vals.append(_config_vars.get(name))
394 return vals
395 else:
396 return _config_vars
397
398def get_config_var(name):
399 """Return the value of a single variable using the dictionary
400 returned by 'get_config_vars()'. Equivalent to
Fred Drakec916cdc2001-08-02 20:03:12 +0000401 get_config_vars().get(name)
Greg Ward879f0f12000-09-15 01:15:08 +0000402 """
403 return get_config_vars().get(name)