blob: 54e515479a999412e3da019cfc8c7bdccdda2084 [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__
R. David Murray5874ed62010-12-26 22:29:53 +000064import traceback
Guido van Rossume57c96e1996-08-17 19:56:26 +000065
Christian Heimesaf748c32008-05-06 22:41:46 +000066# Prefixes for site-packages; add additional prefixes like /usr/local here
67PREFIXES = [sys.prefix, sys.exec_prefix]
68# Enable per user site-packages directory
69# set it to False to disable the feature or True to force the feature
70ENABLE_USER_SITE = None
Tarek Ziadé764fc232009-08-20 21:23:13 +000071
Christian Heimesaf748c32008-05-06 22:41:46 +000072# for distutils.commands.install
Tarek Ziadé764fc232009-08-20 21:23:13 +000073# These values are initialized by the getuserbase() and getusersitepackages()
74# functions, through the main() function when Python starts.
Christian Heimesaf748c32008-05-06 22:41:46 +000075USER_SITE = None
76USER_BASE = None
77
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000078
Fred Drake38cb9f12000-09-28 16:52:36 +000079def makepath(*paths):
Victor Stinnerd2f6ae62010-10-12 22:53:51 +000080 dir = os.path.join(*paths)
81 try:
82 dir = os.path.abspath(dir)
83 except OSError:
84 pass
Fred Drake1fb5ce02001-07-02 16:55:42 +000085 return dir, os.path.normcase(dir)
Fred Drake38cb9f12000-09-28 16:52:36 +000086
Christian Heimesaf748c32008-05-06 22:41:46 +000087
Brett Cannon0096e262004-06-05 01:12:51 +000088def abs__file__():
89 """Set all module' __file__ attribute to an absolute path"""
90 for m in sys.modules.values():
Neal Norwitz0c469852006-04-11 07:21:20 +000091 if hasattr(m, '__loader__'):
Phillip J. Eby47032112006-04-11 01:07:43 +000092 continue # don't mess with a PEP 302-supplied __file__
Brett Cannon0096e262004-06-05 01:12:51 +000093 try:
94 m.__file__ = os.path.abspath(m.__file__)
Victor Stinnerd2f6ae62010-10-12 22:53:51 +000095 except (AttributeError, OSError):
96 pass
Fred Drake38cb9f12000-09-28 16:52:36 +000097
Christian Heimesaf748c32008-05-06 22:41:46 +000098
Brett Cannon0096e262004-06-05 01:12:51 +000099def removeduppaths():
100 """ Remove duplicate entries from sys.path along with making them
101 absolute"""
102 # This ensures that the initial path provided by the interpreter contains
103 # only absolute pathnames, even if we're running from the build directory.
104 L = []
105 known_paths = set()
106 for dir in sys.path:
107 # Filter out duplicate paths (on case-insensitive file systems also
108 # if they only differ in case); turn relative paths into absolute
109 # paths.
110 dir, dircase = makepath(dir)
111 if not dircase in known_paths:
112 L.append(dir)
113 known_paths.add(dircase)
114 sys.path[:] = L
115 return known_paths
Fred Drake38cb9f12000-09-28 16:52:36 +0000116
Fred Drakee80c0d32002-07-25 20:13:03 +0000117# XXX This should not be part of site.py, since it is needed even when
118# using the -S option for Python. See http://www.python.org/sf/586680
Brett Cannon0096e262004-06-05 01:12:51 +0000119def addbuilddir():
120 """Append ./build/lib.<platform> in case we're running in the build dir
121 (especially for Guido :-)"""
Tarek Ziadé5633a802010-01-23 09:23:15 +0000122 from sysconfig import get_platform
Jeremy Hylton6d58bf62003-07-18 17:45:33 +0000123 s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
Georg Brandlf00b38e2008-01-21 21:19:07 +0000124 if hasattr(sys, 'gettotalrefcount'):
125 s += '-pydebug'
Florent Xicluna176cda12010-03-22 22:52:11 +0000126 s = os.path.join(os.path.dirname(sys.path.pop()), s)
Guido van Rossum48eb9cd2001-01-19 21:54:59 +0000127 sys.path.append(s)
Guido van Rossum48eb9cd2001-01-19 21:54:59 +0000128
Christian Heimesaf748c32008-05-06 22:41:46 +0000129
Fred Drake7f5296e2001-07-20 20:06:17 +0000130def _init_pathinfo():
Brett Cannon0096e262004-06-05 01:12:51 +0000131 """Return a set containing all existing directory entries from sys.path"""
132 d = set()
Fred Drake7f5296e2001-07-20 20:06:17 +0000133 for dir in sys.path:
Brett Cannon0096e262004-06-05 01:12:51 +0000134 try:
135 if os.path.isdir(dir):
136 dir, dircase = makepath(dir)
137 d.add(dircase)
138 except TypeError:
Fred Drake7f5296e2001-07-20 20:06:17 +0000139 continue
Brett Cannon0096e262004-06-05 01:12:51 +0000140 return d
Fred Drake7f5296e2001-07-20 20:06:17 +0000141
Christian Heimesaf748c32008-05-06 22:41:46 +0000142
Brett Cannon0096e262004-06-05 01:12:51 +0000143def addpackage(sitedir, name, known_paths):
Georg Brandl8d76cca2007-05-19 18:09:26 +0000144 """Process a .pth file within the site-packages directory:
145 For each line in the file, either combine it with sitedir to a path
146 and add that to known_paths, or execute it if it starts with 'import '.
147 """
Brett Cannon0096e262004-06-05 01:12:51 +0000148 if known_paths is None:
Fred Drake7f5296e2001-07-20 20:06:17 +0000149 _init_pathinfo()
150 reset = 1
151 else:
152 reset = 0
Brett Cannon0096e262004-06-05 01:12:51 +0000153 fullname = os.path.join(sitedir, name)
154 try:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000155 f = open(fullname, "rU")
Brett Cannon0096e262004-06-05 01:12:51 +0000156 except IOError:
157 return
Christian Heimesaf748c32008-05-06 22:41:46 +0000158 with f:
R. David Murray5874ed62010-12-26 22:29:53 +0000159 for n, line in enumerate(f):
Brett Cannon0096e262004-06-05 01:12:51 +0000160 if line.startswith("#"):
161 continue
R. David Murray5874ed62010-12-26 22:29:53 +0000162 try:
163 if line.startswith(("import ", "import\t")):
164 exec line
165 continue
166 line = line.rstrip()
167 dir, dircase = makepath(sitedir, line)
168 if not dircase in known_paths and os.path.exists(dir):
169 sys.path.append(dir)
170 known_paths.add(dircase)
171 except Exception as err:
172 print >>sys.stderr, "Error processing line {:d} of {}:\n".format(
173 n+1, fullname)
174 for record in traceback.format_exception(*sys.exc_info()):
175 for line in record.splitlines():
176 print >>sys.stderr, ' '+line
177 print >>sys.stderr, "\nRemainder of file ignored"
178 break
Brett Cannon0096e262004-06-05 01:12:51 +0000179 if reset:
180 known_paths = None
181 return known_paths
182
Christian Heimesaf748c32008-05-06 22:41:46 +0000183
Brett Cannon12f8c4d2004-07-09 23:38:18 +0000184def addsitedir(sitedir, known_paths=None):
Brett Cannon0096e262004-06-05 01:12:51 +0000185 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
186 'sitedir'"""
187 if known_paths is None:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000188 known_paths = _init_pathinfo()
Brett Cannon0096e262004-06-05 01:12:51 +0000189 reset = 1
190 else:
191 reset = 0
Fred Drake1fb5ce02001-07-02 16:55:42 +0000192 sitedir, sitedircase = makepath(sitedir)
Brett Cannon0096e262004-06-05 01:12:51 +0000193 if not sitedircase in known_paths:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000194 sys.path.append(sitedir) # Add path component
Guido van Rossumf30bec71997-08-29 22:30:45 +0000195 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000196 names = os.listdir(sitedir)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000197 except os.error:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000198 return
Christian Heimesaf748c32008-05-06 22:41:46 +0000199 dotpth = os.extsep + "pth"
200 names = [name for name in names if name.endswith(dotpth)]
201 for name in sorted(names):
202 addpackage(sitedir, name, known_paths)
Fred Drake7f5296e2001-07-20 20:06:17 +0000203 if reset:
Brett Cannon0096e262004-06-05 01:12:51 +0000204 known_paths = None
205 return known_paths
Guido van Rossumf30bec71997-08-29 22:30:45 +0000206
Christian Heimesaf748c32008-05-06 22:41:46 +0000207
208def check_enableusersite():
209 """Check if user site directory is safe for inclusion
210
Andrew M. Kuchling5217d5d2008-05-10 17:36:24 +0000211 The function tests for the command line flag (including environment var),
Christian Heimesaf748c32008-05-06 22:41:46 +0000212 process uid/gid equal to effective uid/gid.
213
214 None: Disabled for security reasons
215 False: Disabled by user (command line option)
216 True: Safe and enabled
217 """
218 if sys.flags.no_user_site:
219 return False
220
221 if hasattr(os, "getuid") and hasattr(os, "geteuid"):
222 # check process uid == effective uid
223 if os.geteuid() != os.getuid():
224 return None
225 if hasattr(os, "getgid") and hasattr(os, "getegid"):
226 # check process gid == effective gid
227 if os.getegid() != os.getgid():
228 return None
229
230 return True
231
Tarek Ziadé764fc232009-08-20 21:23:13 +0000232def getuserbase():
233 """Returns the `user base` directory path.
234
235 The `user base` directory can be used to store data. If the global
236 variable ``USER_BASE`` is not initialized yet, this function will also set
237 it.
238 """
239 global USER_BASE
240 if USER_BASE is not None:
241 return USER_BASE
Tarek Ziadé5633a802010-01-23 09:23:15 +0000242 from sysconfig import get_config_var
243 USER_BASE = get_config_var('userbase')
Tarek Ziadé764fc232009-08-20 21:23:13 +0000244 return USER_BASE
245
246def getusersitepackages():
247 """Returns the user-specific site-packages directory path.
248
249 If the global variable ``USER_SITE`` is not initialized yet, this
250 function will also set it.
251 """
252 global USER_SITE
253 user_base = getuserbase() # this will also set USER_BASE
254
255 if USER_SITE is not None:
256 return USER_SITE
257
Tarek Ziadé5633a802010-01-23 09:23:15 +0000258 from sysconfig import get_path
259 import os
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000260
261 if sys.platform == 'darwin':
262 from sysconfig import get_config_var
263 if get_config_var('PYTHONFRAMEWORK'):
264 USER_SITE = get_path('purelib', 'osx_framework_user')
265 return USER_SITE
266
Tarek Ziadé5633a802010-01-23 09:23:15 +0000267 USER_SITE = get_path('purelib', '%s_user' % os.name)
Tarek Ziadé764fc232009-08-20 21:23:13 +0000268 return USER_SITE
Christian Heimesaf748c32008-05-06 22:41:46 +0000269
270def addusersitepackages(known_paths):
271 """Add a per user site-package to sys.path
272
273 Each user has its own python directory with site-packages in the
274 home directory.
Christian Heimesaf748c32008-05-06 22:41:46 +0000275 """
Tarek Ziadé764fc232009-08-20 21:23:13 +0000276 # get the per user site-package path
277 # this call will also make sure USER_BASE and USER_SITE are set
278 user_site = getusersitepackages()
Christian Heimesaf748c32008-05-06 22:41:46 +0000279
Tarek Ziadé764fc232009-08-20 21:23:13 +0000280 if ENABLE_USER_SITE and os.path.isdir(user_site):
281 addsitedir(user_site, known_paths)
Christian Heimesaf748c32008-05-06 22:41:46 +0000282 return known_paths
283
Tarek Ziadé764fc232009-08-20 21:23:13 +0000284def getsitepackages():
285 """Returns a list containing all global site-packages directories
286 (and possibly site-python).
Christian Heimesaf748c32008-05-06 22:41:46 +0000287
Tarek Ziadé764fc232009-08-20 21:23:13 +0000288 For each directory present in the global ``PREFIXES``, this function
289 will find its `site-packages` subdirectory depending on the system
290 environment, and will return a list of full paths.
291 """
292 sitepackages = []
Benjamin Peterson3b959342010-06-03 21:21:03 +0000293 seen = set()
Christian Heimesaf748c32008-05-06 22:41:46 +0000294
295 for prefix in PREFIXES:
296 if not prefix or prefix in seen:
297 continue
Benjamin Peterson3b959342010-06-03 21:21:03 +0000298 seen.add(prefix)
Christian Heimesaf748c32008-05-06 22:41:46 +0000299
300 if sys.platform in ('os2emx', 'riscos'):
Tarek Ziadé764fc232009-08-20 21:23:13 +0000301 sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000302 elif os.sep == '/':
Tarek Ziadé764fc232009-08-20 21:23:13 +0000303 sitepackages.append(os.path.join(prefix, "lib",
Christian Heimesaf748c32008-05-06 22:41:46 +0000304 "python" + sys.version[:3],
305 "site-packages"))
Tarek Ziadé764fc232009-08-20 21:23:13 +0000306 sitepackages.append(os.path.join(prefix, "lib", "site-python"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000307 else:
Tarek Ziadé764fc232009-08-20 21:23:13 +0000308 sitepackages.append(prefix)
309 sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000310 if sys.platform == "darwin":
311 # for framework builds *only* we add the standard Apple
Ronald Oussorene0154ed2009-03-30 23:10:35 +0000312 # locations.
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000313 from sysconfig import get_config_var
314 framework = get_config_var("PYTHONFRAMEWORK")
Ned Deily2c8bf042012-02-06 00:55:50 +0100315 if framework:
Tarek Ziadé764fc232009-08-20 21:23:13 +0000316 sitepackages.append(
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000317 os.path.join("/Library", framework,
Ronald Oussorene0154ed2009-03-30 23:10:35 +0000318 sys.version[:3], "site-packages"))
Tarek Ziadé764fc232009-08-20 21:23:13 +0000319 return sitepackages
Christian Heimesaf748c32008-05-06 22:41:46 +0000320
Tarek Ziadé764fc232009-08-20 21:23:13 +0000321def addsitepackages(known_paths):
322 """Add site-packages (and possibly site-python) to sys.path"""
323 for sitedir in getsitepackages():
Christian Heimesaf748c32008-05-06 22:41:46 +0000324 if os.path.isdir(sitedir):
325 addsitedir(sitedir, known_paths)
326
327 return known_paths
Fred Drake7f5296e2001-07-20 20:06:17 +0000328
Brett Cannon0096e262004-06-05 01:12:51 +0000329def setBEGINLIBPATH():
330 """The OS/2 EMX port has optional extension modules that do double duty
331 as DLLs (and must use the .DLL file extension) for other extensions.
332 The library search path needs to be amended so these will be found
333 during module import. Use BEGINLIBPATH so that these are at the start
334 of the library search path.
Tim Peters4e0e1b62004-07-07 20:54:48 +0000335
Brett Cannon0096e262004-06-05 01:12:51 +0000336 """
Andrew MacIntyre2e8a6e02003-12-02 12:27:25 +0000337 dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
338 libpath = os.environ['BEGINLIBPATH'].split(';')
339 if libpath[-1]:
340 libpath.append(dllpath)
341 else:
342 libpath[-1] = dllpath
343 os.environ['BEGINLIBPATH'] = ';'.join(libpath)
344
345
Brett Cannon0096e262004-06-05 01:12:51 +0000346def setquit():
Brian Curtinbc96f322010-04-12 23:30:49 +0000347 """Define new builtins 'quit' and 'exit'.
348
349 These are objects which make the interpreter exit when called.
350 The repr of each object contains a hint at how it works.
Guido van Rossumd89fa0c1998-08-07 18:01:14 +0000351
Brett Cannon0096e262004-06-05 01:12:51 +0000352 """
353 if os.sep == ':':
Georg Brandl24cb0532006-03-09 23:22:06 +0000354 eof = 'Cmd-Q'
Brett Cannon0096e262004-06-05 01:12:51 +0000355 elif os.sep == '\\':
Georg Brandl24cb0532006-03-09 23:22:06 +0000356 eof = 'Ctrl-Z plus Return'
Brett Cannon0096e262004-06-05 01:12:51 +0000357 else:
Georg Brandl24cb0532006-03-09 23:22:06 +0000358 eof = 'Ctrl-D (i.e. EOF)'
Tim Peters88ca4672006-03-10 23:39:56 +0000359
Georg Brandl24cb0532006-03-09 23:22:06 +0000360 class Quitter(object):
361 def __init__(self, name):
362 self.name = name
363 def __repr__(self):
364 return 'Use %s() or %s to exit' % (self.name, eof)
365 def __call__(self, code=None):
Kurt B. Kaiserd112bc72006-08-16 05:01:42 +0000366 # Shells like IDLE catch the SystemExit, but listen when their
367 # stdin wrapper is closed.
368 try:
369 sys.stdin.close()
370 except:
371 pass
Georg Brandl24cb0532006-03-09 23:22:06 +0000372 raise SystemExit(code)
373 __builtin__.quit = Quitter('quit')
374 __builtin__.exit = Quitter('exit')
Brett Cannon0096e262004-06-05 01:12:51 +0000375
376
377class _Printer(object):
378 """interactive prompt objects for printing the license text, a list of
379 contributors and the copyright notice."""
380
Guido van Rossumd1252392000-09-05 04:39:55 +0000381 MAXLINES = 23
382
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000383 def __init__(self, name, data, files=(), dirs=()):
384 self.__name = name
385 self.__data = data
386 self.__files = files
387 self.__dirs = dirs
388 self.__lines = None
389
390 def __setup(self):
391 if self.__lines:
392 return
393 data = None
394 for dir in self.__dirs:
Brett Cannon0096e262004-06-05 01:12:51 +0000395 for filename in self.__files:
396 filename = os.path.join(dir, filename)
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000397 try:
Brett Cannon0096e262004-06-05 01:12:51 +0000398 fp = file(filename, "rU")
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000399 data = fp.read()
400 fp.close()
401 break
402 except IOError:
403 pass
404 if data:
405 break
406 if not data:
407 data = self.__data
408 self.__lines = data.split('\n')
Guido van Rossumd1252392000-09-05 04:39:55 +0000409 self.__linecnt = len(self.__lines)
410
411 def __repr__(self):
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000412 self.__setup()
413 if len(self.__lines) <= self.MAXLINES:
414 return "\n".join(self.__lines)
415 else:
416 return "Type %s() to see the full %s text" % ((self.__name,)*2)
417
418 def __call__(self):
419 self.__setup()
Guido van Rossumd1252392000-09-05 04:39:55 +0000420 prompt = 'Hit Return for more, or q (and Return) to quit: '
421 lineno = 0
422 while 1:
423 try:
424 for i in range(lineno, lineno + self.MAXLINES):
425 print self.__lines[i]
426 except IndexError:
427 break
428 else:
429 lineno += self.MAXLINES
430 key = None
431 while key is None:
432 key = raw_input(prompt)
433 if key not in ('', 'q'):
434 key = None
435 if key == 'q':
436 break
Guido van Rossumd1252392000-09-05 04:39:55 +0000437
Brett Cannon0096e262004-06-05 01:12:51 +0000438def setcopyright():
439 """Set 'copyright' and 'credits' in __builtin__"""
440 __builtin__.copyright = _Printer("copyright", sys.copyright)
441 if sys.platform[:4] == 'java':
442 __builtin__.credits = _Printer(
443 "credits",
444 "Jython is maintained by the Jython developers (www.jython.org).")
445 else:
446 __builtin__.credits = _Printer("credits", """\
447 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
448 for supporting Python development. See www.python.org for more information.""")
449 here = os.path.dirname(os.__file__)
450 __builtin__.license = _Printer(
451 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
452 ["LICENSE.txt", "LICENSE"],
453 [os.path.join(here, os.pardir), here, os.curdir])
Guido van Rossumd1252392000-09-05 04:39:55 +0000454
455
Brett Cannon0096e262004-06-05 01:12:51 +0000456class _Helper(object):
Brian Curtinbc96f322010-04-12 23:30:49 +0000457 """Define the builtin 'help'.
Brett Cannon0096e262004-06-05 01:12:51 +0000458 This is a wrapper around pydoc.help (with a twist).
Guido van Rossum83213cc2001-06-12 16:48:52 +0000459
Brett Cannon0096e262004-06-05 01:12:51 +0000460 """
461
Guido van Rossum83213cc2001-06-12 16:48:52 +0000462 def __repr__(self):
463 return "Type help() for interactive help, " \
464 "or help(object) for help about object."
465 def __call__(self, *args, **kwds):
466 import pydoc
467 return pydoc.help(*args, **kwds)
468
Brett Cannon0096e262004-06-05 01:12:51 +0000469def sethelper():
470 __builtin__.help = _Helper()
471
472def aliasmbcs():
473 """On Windows, some default encodings are not provided by Python,
474 while they are always available as "mbcs" in each locale. Make
475 them usable by aliasing to "mbcs" in such a case."""
476 if sys.platform == 'win32':
477 import locale, codecs
478 enc = locale.getdefaultlocale()[1]
479 if enc.startswith('cp'): # "cp***" ?
480 try:
481 codecs.lookup(enc)
482 except LookupError:
483 import encodings
484 encodings._cache[enc] = encodings._unknown
485 encodings.aliases.aliases[enc] = 'mbcs'
486
487def setencoding():
488 """Set the string encoding used by the Unicode implementation. The
489 default is 'ascii', but if you're willing to experiment, you can
490 change this."""
491 encoding = "ascii" # Default value set by _PyUnicode_Init()
492 if 0:
493 # Enable to support locale aware default string encodings.
494 import locale
495 loc = locale.getdefaultlocale()
496 if loc[1]:
497 encoding = loc[1]
498 if 0:
499 # Enable to switch off string to Unicode coercion and implicit
500 # Unicode to string conversion.
501 encoding = "undefined"
502 if encoding != "ascii":
503 # On Non-Unicode builds this will raise an AttributeError...
504 sys.setdefaultencoding(encoding) # Needs Python Unicode build !
Guido van Rossum83213cc2001-06-12 16:48:52 +0000505
506
Brett Cannon0096e262004-06-05 01:12:51 +0000507def execsitecustomize():
508 """Run custom site specific code, if available."""
509 try:
510 import sitecustomize
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, \
518 "'import sitecustomize' failed; use -v for traceback"
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000519
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000520
Christian Heimesaf748c32008-05-06 22:41:46 +0000521def execusercustomize():
522 """Run custom user specific code, if available."""
523 try:
524 import usercustomize
525 except ImportError:
526 pass
Victor Stinner66644262010-03-10 22:30:19 +0000527 except Exception:
528 if sys.flags.verbose:
529 sys.excepthook(*sys.exc_info())
530 else:
531 print>>sys.stderr, \
Victor Stinner3ec32002010-03-10 22:45:04 +0000532 "'import usercustomize' failed; use -v for traceback"
Christian Heimesaf748c32008-05-06 22:41:46 +0000533
534
Brett Cannon0096e262004-06-05 01:12:51 +0000535def main():
Christian Heimesaf748c32008-05-06 22:41:46 +0000536 global ENABLE_USER_SITE
537
Brett Cannon0096e262004-06-05 01:12:51 +0000538 abs__file__()
Christian Heimesaf748c32008-05-06 22:41:46 +0000539 known_paths = removeduppaths()
Brett Cannon0096e262004-06-05 01:12:51 +0000540 if (os.name == "posix" and sys.path and
541 os.path.basename(sys.path[-1]) == "Modules"):
542 addbuilddir()
Christian Heimesaf748c32008-05-06 22:41:46 +0000543 if ENABLE_USER_SITE is None:
544 ENABLE_USER_SITE = check_enableusersite()
545 known_paths = addusersitepackages(known_paths)
546 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000547 if sys.platform == 'os2emx':
548 setBEGINLIBPATH()
549 setquit()
550 setcopyright()
551 sethelper()
552 aliasmbcs()
553 setencoding()
554 execsitecustomize()
Christian Heimesaf748c32008-05-06 22:41:46 +0000555 if ENABLE_USER_SITE:
556 execusercustomize()
Brett Cannon0096e262004-06-05 01:12:51 +0000557 # Remove sys.setdefaultencoding() so that users cannot change the
558 # encoding after initialization. The test for presence is needed when
559 # this module is run as a script, because this code is executed twice.
560 if hasattr(sys, "setdefaultencoding"):
561 del sys.setdefaultencoding
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000562
Brett Cannon0096e262004-06-05 01:12:51 +0000563main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000564
Christian Heimesaf748c32008-05-06 22:41:46 +0000565def _script():
566 help = """\
567 %s [--user-base] [--user-site]
568
569 Without arguments print some useful information
570 With arguments print the value of USER_BASE and/or USER_SITE separated
571 by '%s'.
572
573 Exit codes with --user-base or --user-site:
574 0 - user site directory is enabled
Christian Heimes17433d22008-05-09 12:19:09 +0000575 1 - user site directory is disabled by user
Christian Heimesaf748c32008-05-06 22:41:46 +0000576 2 - uses site directory is disabled by super user
577 or for security reasons
578 >2 - unknown error
579 """
580 args = sys.argv[1:]
581 if not args:
582 print "sys.path = ["
583 for dir in sys.path:
584 print " %r," % (dir,)
585 print "]"
586 print "USER_BASE: %r (%s)" % (USER_BASE,
587 "exists" if os.path.isdir(USER_BASE) else "doesn't exist")
588 print "USER_SITE: %r (%s)" % (USER_SITE,
589 "exists" if os.path.isdir(USER_SITE) else "doesn't exist")
590 print "ENABLE_USER_SITE: %r" % ENABLE_USER_SITE
591 sys.exit(0)
592
593 buffer = []
594 if '--user-base' in args:
595 buffer.append(USER_BASE)
596 if '--user-site' in args:
597 buffer.append(USER_SITE)
598
599 if buffer:
600 print os.pathsep.join(buffer)
601 if ENABLE_USER_SITE:
602 sys.exit(0)
603 elif ENABLE_USER_SITE is False:
604 sys.exit(1)
605 elif ENABLE_USER_SITE is None:
606 sys.exit(2)
607 else:
608 sys.exit(3)
609 else:
610 import textwrap
611 print textwrap.dedent(help % (sys.argv[0], os.pathsep))
612 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000613
614if __name__ == '__main__':
Christian Heimesaf748c32008-05-06 22:41:46 +0000615 _script()