blob: 9865cc940e0068ed5460fd55df8ed4df40638eeb [file] [log] [blame]
Guido van Rossumf30bec71997-08-29 22:30:45 +00001"""Append module search paths for third-party packages to sys.path.
Guido van Rossume57c96e1996-08-17 19:56:26 +00002
Guido van Rossumf30bec71997-08-29 22:30:45 +00003****************************************************************
4* This module is automatically imported during initialization. *
5****************************************************************
Guido van Rossume57c96e1996-08-17 19:56:26 +00006
Guido van Rossumf30bec71997-08-29 22:30:45 +00007In earlier versions of Python (up to 1.5a3), scripts or modules that
8needed to use site-specific modules would place ``import site''
9somewhere near the top of their code. Because of the automatic
10import, this is no longer necessary (but code that does it still
11works).
Guido van Rossume57c96e1996-08-17 19:56:26 +000012
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +000013This will append site-specific paths to the module search path. On
Nick Coghlanf2b16f32006-06-12 08:23:02 +000014Unix (including Mac OSX), it starts with sys.prefix and
15sys.exec_prefix (if different) and appends
16lib/python<version>/site-packages as well as lib/site-python.
17On other platforms (such as Windows), it tries each of the
Nick Coghlan3fb55ca2006-06-12 08:19:37 +000018prefixes directly, as well as with lib/site-packages appended. The
Guido van Rossum62b297b1997-09-08 02:14:09 +000019resulting directories, if they exist, are appended to sys.path, and
20also inspected for path configuration files.
Guido van Rossume57c96e1996-08-17 19:56:26 +000021
Guido van Rossumf30bec71997-08-29 22:30:45 +000022A path configuration file is a file whose name has the form
23<package>.pth; its contents are additional directories (one per line)
24to be added to sys.path. Non-existing directories (or
25non-directories) are never added to sys.path; no directory is added to
26sys.path more than once. Blank lines and lines beginning with
Guido van Rossumfacf24b2001-12-17 16:07:06 +000027'#' are skipped. Lines starting with 'import' are executed.
Guido van Rossume57c96e1996-08-17 19:56:26 +000028
Guido van Rossumf30bec71997-08-29 22:30:45 +000029For example, suppose sys.prefix and sys.exec_prefix are set to
Neal Norwitz6e482562006-08-15 04:59:30 +000030/usr/local and there is a directory /usr/local/lib/python2.5/site-packages
Guido van Rossum62b297b1997-09-08 02:14:09 +000031with three subdirectories, foo, bar and spam, and two path
32configuration files, foo.pth and bar.pth. Assume foo.pth contains the
33following:
Guido van Rossumf30bec71997-08-29 22:30:45 +000034
35 # foo package configuration
36 foo
37 bar
38 bletch
39
40and bar.pth contains:
41
42 # bar package configuration
43 bar
44
45Then the following directories are added to sys.path, in this order:
46
Neal Norwitz6e482562006-08-15 04:59:30 +000047 /usr/local/lib/python2.5/site-packages/bar
48 /usr/local/lib/python2.5/site-packages/foo
Guido van Rossumf30bec71997-08-29 22:30:45 +000049
50Note that bletch is omitted because it doesn't exist; bar precedes foo
51because bar.pth comes alphabetically before foo.pth; and spam is
52omitted because it is not mentioned in either path configuration file.
Guido van Rossume57c96e1996-08-17 19:56:26 +000053
54After these path manipulations, an attempt is made to import a module
Guido van Rossumf30bec71997-08-29 22:30:45 +000055named sitecustomize, which can perform arbitrary additional
56site-specific customizations. If this import fails with an
57ImportError exception, it is silently ignored.
Guido van Rossume57c96e1996-08-17 19:56:26 +000058
Guido van Rossume57c96e1996-08-17 19:56:26 +000059"""
60
Brett Cannon0096e262004-06-05 01:12:51 +000061import sys
62import os
63import __builtin__
Guido van Rossume57c96e1996-08-17 19:56:26 +000064
Christian Heimesaf748c32008-05-06 22:41:46 +000065# Prefixes for site-packages; add additional prefixes like /usr/local here
66PREFIXES = [sys.prefix, sys.exec_prefix]
67# Enable per user site-packages directory
68# set it to False to disable the feature or True to force the feature
69ENABLE_USER_SITE = None
Tarek Ziadé764fc232009-08-20 21:23:13 +000070
Christian Heimesaf748c32008-05-06 22:41:46 +000071# for distutils.commands.install
Tarek Ziadé764fc232009-08-20 21:23:13 +000072# These values are initialized by the getuserbase() and getusersitepackages()
73# functions, through the main() function when Python starts.
Christian Heimesaf748c32008-05-06 22:41:46 +000074USER_SITE = None
75USER_BASE = None
76
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000077
Fred Drake38cb9f12000-09-28 16:52:36 +000078def makepath(*paths):
Fred Drake1fb5ce02001-07-02 16:55:42 +000079 dir = os.path.abspath(os.path.join(*paths))
80 return dir, os.path.normcase(dir)
Fred Drake38cb9f12000-09-28 16:52:36 +000081
Christian Heimesaf748c32008-05-06 22:41:46 +000082
Brett Cannon0096e262004-06-05 01:12:51 +000083def abs__file__():
84 """Set all module' __file__ attribute to an absolute path"""
85 for m in sys.modules.values():
Neal Norwitz0c469852006-04-11 07:21:20 +000086 if hasattr(m, '__loader__'):
Phillip J. Eby47032112006-04-11 01:07:43 +000087 continue # don't mess with a PEP 302-supplied __file__
Brett Cannon0096e262004-06-05 01:12:51 +000088 try:
89 m.__file__ = os.path.abspath(m.__file__)
90 except AttributeError:
91 continue
Fred Drake38cb9f12000-09-28 16:52:36 +000092
Christian Heimesaf748c32008-05-06 22:41:46 +000093
Brett Cannon0096e262004-06-05 01:12:51 +000094def removeduppaths():
95 """ Remove duplicate entries from sys.path along with making them
96 absolute"""
97 # This ensures that the initial path provided by the interpreter contains
98 # only absolute pathnames, even if we're running from the build directory.
99 L = []
100 known_paths = set()
101 for dir in sys.path:
102 # Filter out duplicate paths (on case-insensitive file systems also
103 # if they only differ in case); turn relative paths into absolute
104 # paths.
105 dir, dircase = makepath(dir)
106 if not dircase in known_paths:
107 L.append(dir)
108 known_paths.add(dircase)
109 sys.path[:] = L
110 return known_paths
Fred Drake38cb9f12000-09-28 16:52:36 +0000111
Fred Drakee80c0d32002-07-25 20:13:03 +0000112# XXX This should not be part of site.py, since it is needed even when
113# using the -S option for Python. See http://www.python.org/sf/586680
Brett Cannon0096e262004-06-05 01:12:51 +0000114def addbuilddir():
115 """Append ./build/lib.<platform> in case we're running in the build dir
116 (especially for Guido :-)"""
Tarek Ziadé5633a802010-01-23 09:23:15 +0000117 from sysconfig import get_platform
Jeremy Hylton6d58bf62003-07-18 17:45:33 +0000118 s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
Georg Brandlf00b38e2008-01-21 21:19:07 +0000119 if hasattr(sys, 'gettotalrefcount'):
120 s += '-pydebug'
Florent Xicluna176cda12010-03-22 22:52:11 +0000121 s = os.path.join(os.path.dirname(sys.path.pop()), s)
Guido van Rossum48eb9cd2001-01-19 21:54:59 +0000122 sys.path.append(s)
Guido van Rossum48eb9cd2001-01-19 21:54:59 +0000123
Christian Heimesaf748c32008-05-06 22:41:46 +0000124
Fred Drake7f5296e2001-07-20 20:06:17 +0000125def _init_pathinfo():
Brett Cannon0096e262004-06-05 01:12:51 +0000126 """Return a set containing all existing directory entries from sys.path"""
127 d = set()
Fred Drake7f5296e2001-07-20 20:06:17 +0000128 for dir in sys.path:
Brett Cannon0096e262004-06-05 01:12:51 +0000129 try:
130 if os.path.isdir(dir):
131 dir, dircase = makepath(dir)
132 d.add(dircase)
133 except TypeError:
Fred Drake7f5296e2001-07-20 20:06:17 +0000134 continue
Brett Cannon0096e262004-06-05 01:12:51 +0000135 return d
Fred Drake7f5296e2001-07-20 20:06:17 +0000136
Christian Heimesaf748c32008-05-06 22:41:46 +0000137
Brett Cannon0096e262004-06-05 01:12:51 +0000138def addpackage(sitedir, name, known_paths):
Georg Brandl8d76cca2007-05-19 18:09:26 +0000139 """Process a .pth file within the site-packages directory:
140 For each line in the file, either combine it with sitedir to a path
141 and add that to known_paths, or execute it if it starts with 'import '.
142 """
Brett Cannon0096e262004-06-05 01:12:51 +0000143 if known_paths is None:
Fred Drake7f5296e2001-07-20 20:06:17 +0000144 _init_pathinfo()
145 reset = 1
146 else:
147 reset = 0
Brett Cannon0096e262004-06-05 01:12:51 +0000148 fullname = os.path.join(sitedir, name)
149 try:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000150 f = open(fullname, "rU")
Brett Cannon0096e262004-06-05 01:12:51 +0000151 except IOError:
152 return
Christian Heimesaf748c32008-05-06 22:41:46 +0000153 with f:
Brett Cannon0096e262004-06-05 01:12:51 +0000154 for line in f:
155 if line.startswith("#"):
156 continue
Christian Heimesaf748c32008-05-06 22:41:46 +0000157 if line.startswith(("import ", "import\t")):
Brett Cannon0096e262004-06-05 01:12:51 +0000158 exec line
159 continue
160 line = line.rstrip()
161 dir, dircase = makepath(sitedir, line)
162 if not dircase in known_paths and os.path.exists(dir):
163 sys.path.append(dir)
164 known_paths.add(dircase)
Brett Cannon0096e262004-06-05 01:12:51 +0000165 if reset:
166 known_paths = None
167 return known_paths
168
Christian Heimesaf748c32008-05-06 22:41:46 +0000169
Brett Cannon12f8c4d2004-07-09 23:38:18 +0000170def addsitedir(sitedir, known_paths=None):
Brett Cannon0096e262004-06-05 01:12:51 +0000171 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
172 'sitedir'"""
173 if known_paths is None:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000174 known_paths = _init_pathinfo()
Brett Cannon0096e262004-06-05 01:12:51 +0000175 reset = 1
176 else:
177 reset = 0
Fred Drake1fb5ce02001-07-02 16:55:42 +0000178 sitedir, sitedircase = makepath(sitedir)
Brett Cannon0096e262004-06-05 01:12:51 +0000179 if not sitedircase in known_paths:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000180 sys.path.append(sitedir) # Add path component
Guido van Rossumf30bec71997-08-29 22:30:45 +0000181 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000182 names = os.listdir(sitedir)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000183 except os.error:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000184 return
Christian Heimesaf748c32008-05-06 22:41:46 +0000185 dotpth = os.extsep + "pth"
186 names = [name for name in names if name.endswith(dotpth)]
187 for name in sorted(names):
188 addpackage(sitedir, name, known_paths)
Fred Drake7f5296e2001-07-20 20:06:17 +0000189 if reset:
Brett Cannon0096e262004-06-05 01:12:51 +0000190 known_paths = None
191 return known_paths
Guido van Rossumf30bec71997-08-29 22:30:45 +0000192
Christian Heimesaf748c32008-05-06 22:41:46 +0000193
194def check_enableusersite():
195 """Check if user site directory is safe for inclusion
196
Andrew M. Kuchling5217d5d2008-05-10 17:36:24 +0000197 The function tests for the command line flag (including environment var),
Christian Heimesaf748c32008-05-06 22:41:46 +0000198 process uid/gid equal to effective uid/gid.
199
200 None: Disabled for security reasons
201 False: Disabled by user (command line option)
202 True: Safe and enabled
203 """
204 if sys.flags.no_user_site:
205 return False
206
207 if hasattr(os, "getuid") and hasattr(os, "geteuid"):
208 # check process uid == effective uid
209 if os.geteuid() != os.getuid():
210 return None
211 if hasattr(os, "getgid") and hasattr(os, "getegid"):
212 # check process gid == effective gid
213 if os.getegid() != os.getgid():
214 return None
215
216 return True
217
Tarek Ziadé764fc232009-08-20 21:23:13 +0000218def getuserbase():
219 """Returns the `user base` directory path.
220
221 The `user base` directory can be used to store data. If the global
222 variable ``USER_BASE`` is not initialized yet, this function will also set
223 it.
224 """
225 global USER_BASE
226 if USER_BASE is not None:
227 return USER_BASE
Tarek Ziadé5633a802010-01-23 09:23:15 +0000228 from sysconfig import get_config_var
229 USER_BASE = get_config_var('userbase')
Tarek Ziadé764fc232009-08-20 21:23:13 +0000230 return USER_BASE
231
232def getusersitepackages():
233 """Returns the user-specific site-packages directory path.
234
235 If the global variable ``USER_SITE`` is not initialized yet, this
236 function will also set it.
237 """
238 global USER_SITE
239 user_base = getuserbase() # this will also set USER_BASE
240
241 if USER_SITE is not None:
242 return USER_SITE
243
Tarek Ziadé5633a802010-01-23 09:23:15 +0000244 from sysconfig import get_path
245 import os
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000246
247 if sys.platform == 'darwin':
248 from sysconfig import get_config_var
249 if get_config_var('PYTHONFRAMEWORK'):
250 USER_SITE = get_path('purelib', 'osx_framework_user')
251 return USER_SITE
252
Tarek Ziadé5633a802010-01-23 09:23:15 +0000253 USER_SITE = get_path('purelib', '%s_user' % os.name)
Tarek Ziadé764fc232009-08-20 21:23:13 +0000254 return USER_SITE
Christian Heimesaf748c32008-05-06 22:41:46 +0000255
256def addusersitepackages(known_paths):
257 """Add a per user site-package to sys.path
258
259 Each user has its own python directory with site-packages in the
260 home directory.
Christian Heimesaf748c32008-05-06 22:41:46 +0000261 """
Tarek Ziadé764fc232009-08-20 21:23:13 +0000262 # get the per user site-package path
263 # this call will also make sure USER_BASE and USER_SITE are set
264 user_site = getusersitepackages()
Christian Heimesaf748c32008-05-06 22:41:46 +0000265
Tarek Ziadé764fc232009-08-20 21:23:13 +0000266 if ENABLE_USER_SITE and os.path.isdir(user_site):
267 addsitedir(user_site, known_paths)
Christian Heimesaf748c32008-05-06 22:41:46 +0000268 return known_paths
269
Tarek Ziadé764fc232009-08-20 21:23:13 +0000270def getsitepackages():
271 """Returns a list containing all global site-packages directories
272 (and possibly site-python).
Christian Heimesaf748c32008-05-06 22:41:46 +0000273
Tarek Ziadé764fc232009-08-20 21:23:13 +0000274 For each directory present in the global ``PREFIXES``, this function
275 will find its `site-packages` subdirectory depending on the system
276 environment, and will return a list of full paths.
277 """
278 sitepackages = []
Benjamin Peterson3b959342010-06-03 21:21:03 +0000279 seen = set()
Christian Heimesaf748c32008-05-06 22:41:46 +0000280
281 for prefix in PREFIXES:
282 if not prefix or prefix in seen:
283 continue
Benjamin Peterson3b959342010-06-03 21:21:03 +0000284 seen.add(prefix)
Christian Heimesaf748c32008-05-06 22:41:46 +0000285
286 if sys.platform in ('os2emx', 'riscos'):
Tarek Ziadé764fc232009-08-20 21:23:13 +0000287 sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000288 elif os.sep == '/':
Tarek Ziadé764fc232009-08-20 21:23:13 +0000289 sitepackages.append(os.path.join(prefix, "lib",
Christian Heimesaf748c32008-05-06 22:41:46 +0000290 "python" + sys.version[:3],
291 "site-packages"))
Tarek Ziadé764fc232009-08-20 21:23:13 +0000292 sitepackages.append(os.path.join(prefix, "lib", "site-python"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000293 else:
Tarek Ziadé764fc232009-08-20 21:23:13 +0000294 sitepackages.append(prefix)
295 sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000296 if sys.platform == "darwin":
297 # for framework builds *only* we add the standard Apple
Ronald Oussorene0154ed2009-03-30 23:10:35 +0000298 # locations.
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000299 from sysconfig import get_config_var
300 framework = get_config_var("PYTHONFRAMEWORK")
301 if framework and "/%s.framework/"%(framework,) in prefix:
Tarek Ziadé764fc232009-08-20 21:23:13 +0000302 sitepackages.append(
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000303 os.path.join("/Library", framework,
Ronald Oussorene0154ed2009-03-30 23:10:35 +0000304 sys.version[:3], "site-packages"))
Tarek Ziadé764fc232009-08-20 21:23:13 +0000305 return sitepackages
Christian Heimesaf748c32008-05-06 22:41:46 +0000306
Tarek Ziadé764fc232009-08-20 21:23:13 +0000307def addsitepackages(known_paths):
308 """Add site-packages (and possibly site-python) to sys.path"""
309 for sitedir in getsitepackages():
Christian Heimesaf748c32008-05-06 22:41:46 +0000310 if os.path.isdir(sitedir):
311 addsitedir(sitedir, known_paths)
312
313 return known_paths
Fred Drake7f5296e2001-07-20 20:06:17 +0000314
Brett Cannon0096e262004-06-05 01:12:51 +0000315def setBEGINLIBPATH():
316 """The OS/2 EMX port has optional extension modules that do double duty
317 as DLLs (and must use the .DLL file extension) for other extensions.
318 The library search path needs to be amended so these will be found
319 during module import. Use BEGINLIBPATH so that these are at the start
320 of the library search path.
Tim Peters4e0e1b62004-07-07 20:54:48 +0000321
Brett Cannon0096e262004-06-05 01:12:51 +0000322 """
Andrew MacIntyre2e8a6e02003-12-02 12:27:25 +0000323 dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
324 libpath = os.environ['BEGINLIBPATH'].split(';')
325 if libpath[-1]:
326 libpath.append(dllpath)
327 else:
328 libpath[-1] = dllpath
329 os.environ['BEGINLIBPATH'] = ';'.join(libpath)
330
331
Brett Cannon0096e262004-06-05 01:12:51 +0000332def setquit():
Brian Curtinbc96f322010-04-12 23:30:49 +0000333 """Define new builtins 'quit' and 'exit'.
334
335 These are objects which make the interpreter exit when called.
336 The repr of each object contains a hint at how it works.
Guido van Rossumd89fa0c1998-08-07 18:01:14 +0000337
Brett Cannon0096e262004-06-05 01:12:51 +0000338 """
339 if os.sep == ':':
Georg Brandl24cb0532006-03-09 23:22:06 +0000340 eof = 'Cmd-Q'
Brett Cannon0096e262004-06-05 01:12:51 +0000341 elif os.sep == '\\':
Georg Brandl24cb0532006-03-09 23:22:06 +0000342 eof = 'Ctrl-Z plus Return'
Brett Cannon0096e262004-06-05 01:12:51 +0000343 else:
Georg Brandl24cb0532006-03-09 23:22:06 +0000344 eof = 'Ctrl-D (i.e. EOF)'
Tim Peters88ca4672006-03-10 23:39:56 +0000345
Georg Brandl24cb0532006-03-09 23:22:06 +0000346 class Quitter(object):
347 def __init__(self, name):
348 self.name = name
349 def __repr__(self):
350 return 'Use %s() or %s to exit' % (self.name, eof)
351 def __call__(self, code=None):
Kurt B. Kaiserd112bc72006-08-16 05:01:42 +0000352 # Shells like IDLE catch the SystemExit, but listen when their
353 # stdin wrapper is closed.
354 try:
355 sys.stdin.close()
356 except:
357 pass
Georg Brandl24cb0532006-03-09 23:22:06 +0000358 raise SystemExit(code)
359 __builtin__.quit = Quitter('quit')
360 __builtin__.exit = Quitter('exit')
Brett Cannon0096e262004-06-05 01:12:51 +0000361
362
363class _Printer(object):
364 """interactive prompt objects for printing the license text, a list of
365 contributors and the copyright notice."""
366
Guido van Rossumd1252392000-09-05 04:39:55 +0000367 MAXLINES = 23
368
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000369 def __init__(self, name, data, files=(), dirs=()):
370 self.__name = name
371 self.__data = data
372 self.__files = files
373 self.__dirs = dirs
374 self.__lines = None
375
376 def __setup(self):
377 if self.__lines:
378 return
379 data = None
380 for dir in self.__dirs:
Brett Cannon0096e262004-06-05 01:12:51 +0000381 for filename in self.__files:
382 filename = os.path.join(dir, filename)
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000383 try:
Brett Cannon0096e262004-06-05 01:12:51 +0000384 fp = file(filename, "rU")
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000385 data = fp.read()
386 fp.close()
387 break
388 except IOError:
389 pass
390 if data:
391 break
392 if not data:
393 data = self.__data
394 self.__lines = data.split('\n')
Guido van Rossumd1252392000-09-05 04:39:55 +0000395 self.__linecnt = len(self.__lines)
396
397 def __repr__(self):
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000398 self.__setup()
399 if len(self.__lines) <= self.MAXLINES:
400 return "\n".join(self.__lines)
401 else:
402 return "Type %s() to see the full %s text" % ((self.__name,)*2)
403
404 def __call__(self):
405 self.__setup()
Guido van Rossumd1252392000-09-05 04:39:55 +0000406 prompt = 'Hit Return for more, or q (and Return) to quit: '
407 lineno = 0
408 while 1:
409 try:
410 for i in range(lineno, lineno + self.MAXLINES):
411 print self.__lines[i]
412 except IndexError:
413 break
414 else:
415 lineno += self.MAXLINES
416 key = None
417 while key is None:
418 key = raw_input(prompt)
419 if key not in ('', 'q'):
420 key = None
421 if key == 'q':
422 break
Guido van Rossumd1252392000-09-05 04:39:55 +0000423
Brett Cannon0096e262004-06-05 01:12:51 +0000424def setcopyright():
425 """Set 'copyright' and 'credits' in __builtin__"""
426 __builtin__.copyright = _Printer("copyright", sys.copyright)
427 if sys.platform[:4] == 'java':
428 __builtin__.credits = _Printer(
429 "credits",
430 "Jython is maintained by the Jython developers (www.jython.org).")
431 else:
432 __builtin__.credits = _Printer("credits", """\
433 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
434 for supporting Python development. See www.python.org for more information.""")
435 here = os.path.dirname(os.__file__)
436 __builtin__.license = _Printer(
437 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
438 ["LICENSE.txt", "LICENSE"],
439 [os.path.join(here, os.pardir), here, os.curdir])
Guido van Rossumd1252392000-09-05 04:39:55 +0000440
441
Brett Cannon0096e262004-06-05 01:12:51 +0000442class _Helper(object):
Brian Curtinbc96f322010-04-12 23:30:49 +0000443 """Define the builtin 'help'.
Brett Cannon0096e262004-06-05 01:12:51 +0000444 This is a wrapper around pydoc.help (with a twist).
Guido van Rossum83213cc2001-06-12 16:48:52 +0000445
Brett Cannon0096e262004-06-05 01:12:51 +0000446 """
447
Guido van Rossum83213cc2001-06-12 16:48:52 +0000448 def __repr__(self):
449 return "Type help() for interactive help, " \
450 "or help(object) for help about object."
451 def __call__(self, *args, **kwds):
452 import pydoc
453 return pydoc.help(*args, **kwds)
454
Brett Cannon0096e262004-06-05 01:12:51 +0000455def sethelper():
456 __builtin__.help = _Helper()
457
458def aliasmbcs():
459 """On Windows, some default encodings are not provided by Python,
460 while they are always available as "mbcs" in each locale. Make
461 them usable by aliasing to "mbcs" in such a case."""
462 if sys.platform == 'win32':
463 import locale, codecs
464 enc = locale.getdefaultlocale()[1]
465 if enc.startswith('cp'): # "cp***" ?
466 try:
467 codecs.lookup(enc)
468 except LookupError:
469 import encodings
470 encodings._cache[enc] = encodings._unknown
471 encodings.aliases.aliases[enc] = 'mbcs'
472
473def setencoding():
474 """Set the string encoding used by the Unicode implementation. The
475 default is 'ascii', but if you're willing to experiment, you can
476 change this."""
477 encoding = "ascii" # Default value set by _PyUnicode_Init()
478 if 0:
479 # Enable to support locale aware default string encodings.
480 import locale
481 loc = locale.getdefaultlocale()
482 if loc[1]:
483 encoding = loc[1]
484 if 0:
485 # Enable to switch off string to Unicode coercion and implicit
486 # Unicode to string conversion.
487 encoding = "undefined"
488 if encoding != "ascii":
489 # On Non-Unicode builds this will raise an AttributeError...
490 sys.setdefaultencoding(encoding) # Needs Python Unicode build !
Guido van Rossum83213cc2001-06-12 16:48:52 +0000491
492
Brett Cannon0096e262004-06-05 01:12:51 +0000493def execsitecustomize():
494 """Run custom site specific code, if available."""
495 try:
496 import sitecustomize
497 except ImportError:
498 pass
Victor Stinner66644262010-03-10 22:30:19 +0000499 except Exception:
500 if sys.flags.verbose:
501 sys.excepthook(*sys.exc_info())
502 else:
503 print >>sys.stderr, \
504 "'import sitecustomize' failed; use -v for traceback"
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000505
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000506
Christian Heimesaf748c32008-05-06 22:41:46 +0000507def execusercustomize():
508 """Run custom user specific code, if available."""
509 try:
510 import usercustomize
511 except ImportError:
512 pass
Victor Stinner66644262010-03-10 22:30:19 +0000513 except Exception:
514 if sys.flags.verbose:
515 sys.excepthook(*sys.exc_info())
516 else:
517 print>>sys.stderr, \
Victor Stinner3ec32002010-03-10 22:45:04 +0000518 "'import usercustomize' failed; use -v for traceback"
Christian Heimesaf748c32008-05-06 22:41:46 +0000519
520
Brett Cannon0096e262004-06-05 01:12:51 +0000521def main():
Christian Heimesaf748c32008-05-06 22:41:46 +0000522 global ENABLE_USER_SITE
523
Brett Cannon0096e262004-06-05 01:12:51 +0000524 abs__file__()
Christian Heimesaf748c32008-05-06 22:41:46 +0000525 known_paths = removeduppaths()
Brett Cannon0096e262004-06-05 01:12:51 +0000526 if (os.name == "posix" and sys.path and
527 os.path.basename(sys.path[-1]) == "Modules"):
528 addbuilddir()
Christian Heimesaf748c32008-05-06 22:41:46 +0000529 if ENABLE_USER_SITE is None:
530 ENABLE_USER_SITE = check_enableusersite()
531 known_paths = addusersitepackages(known_paths)
532 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000533 if sys.platform == 'os2emx':
534 setBEGINLIBPATH()
535 setquit()
536 setcopyright()
537 sethelper()
538 aliasmbcs()
539 setencoding()
540 execsitecustomize()
Christian Heimesaf748c32008-05-06 22:41:46 +0000541 if ENABLE_USER_SITE:
542 execusercustomize()
Brett Cannon0096e262004-06-05 01:12:51 +0000543 # Remove sys.setdefaultencoding() so that users cannot change the
544 # encoding after initialization. The test for presence is needed when
545 # this module is run as a script, because this code is executed twice.
546 if hasattr(sys, "setdefaultencoding"):
547 del sys.setdefaultencoding
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000548
Brett Cannon0096e262004-06-05 01:12:51 +0000549main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000550
Christian Heimesaf748c32008-05-06 22:41:46 +0000551def _script():
552 help = """\
553 %s [--user-base] [--user-site]
554
555 Without arguments print some useful information
556 With arguments print the value of USER_BASE and/or USER_SITE separated
557 by '%s'.
558
559 Exit codes with --user-base or --user-site:
560 0 - user site directory is enabled
Christian Heimes17433d22008-05-09 12:19:09 +0000561 1 - user site directory is disabled by user
Christian Heimesaf748c32008-05-06 22:41:46 +0000562 2 - uses site directory is disabled by super user
563 or for security reasons
564 >2 - unknown error
565 """
566 args = sys.argv[1:]
567 if not args:
568 print "sys.path = ["
569 for dir in sys.path:
570 print " %r," % (dir,)
571 print "]"
572 print "USER_BASE: %r (%s)" % (USER_BASE,
573 "exists" if os.path.isdir(USER_BASE) else "doesn't exist")
574 print "USER_SITE: %r (%s)" % (USER_SITE,
575 "exists" if os.path.isdir(USER_SITE) else "doesn't exist")
576 print "ENABLE_USER_SITE: %r" % ENABLE_USER_SITE
577 sys.exit(0)
578
579 buffer = []
580 if '--user-base' in args:
581 buffer.append(USER_BASE)
582 if '--user-site' in args:
583 buffer.append(USER_SITE)
584
585 if buffer:
586 print os.pathsep.join(buffer)
587 if ENABLE_USER_SITE:
588 sys.exit(0)
589 elif ENABLE_USER_SITE is False:
590 sys.exit(1)
591 elif ENABLE_USER_SITE is None:
592 sys.exit(2)
593 else:
594 sys.exit(3)
595 else:
596 import textwrap
597 print textwrap.dedent(help % (sys.argv[0], os.pathsep))
598 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000599
600if __name__ == '__main__':
Christian Heimesaf748c32008-05-06 22:41:46 +0000601 _script()