blob: f22e1d10009a06d884cc0d3ab70d885b62d25932 [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):
Victor Stinnerd2f6ae62010-10-12 22:53:51 +000079 dir = os.path.join(*paths)
80 try:
81 dir = os.path.abspath(dir)
82 except OSError:
83 pass
Fred Drake1fb5ce02001-07-02 16:55:42 +000084 return dir, os.path.normcase(dir)
Fred Drake38cb9f12000-09-28 16:52:36 +000085
Christian Heimesaf748c32008-05-06 22:41:46 +000086
Brett Cannon0096e262004-06-05 01:12:51 +000087def abs__file__():
88 """Set all module' __file__ attribute to an absolute path"""
89 for m in sys.modules.values():
Neal Norwitz0c469852006-04-11 07:21:20 +000090 if hasattr(m, '__loader__'):
Phillip J. Eby47032112006-04-11 01:07:43 +000091 continue # don't mess with a PEP 302-supplied __file__
Brett Cannon0096e262004-06-05 01:12:51 +000092 try:
93 m.__file__ = os.path.abspath(m.__file__)
Victor Stinnerd2f6ae62010-10-12 22:53:51 +000094 except (AttributeError, OSError):
95 pass
Fred Drake38cb9f12000-09-28 16:52:36 +000096
Christian Heimesaf748c32008-05-06 22:41:46 +000097
Brett Cannon0096e262004-06-05 01:12:51 +000098def removeduppaths():
99 """ Remove duplicate entries from sys.path along with making them
100 absolute"""
101 # This ensures that the initial path provided by the interpreter contains
102 # only absolute pathnames, even if we're running from the build directory.
103 L = []
104 known_paths = set()
105 for dir in sys.path:
106 # Filter out duplicate paths (on case-insensitive file systems also
107 # if they only differ in case); turn relative paths into absolute
108 # paths.
109 dir, dircase = makepath(dir)
110 if not dircase in known_paths:
111 L.append(dir)
112 known_paths.add(dircase)
113 sys.path[:] = L
114 return known_paths
Fred Drake38cb9f12000-09-28 16:52:36 +0000115
Fred Drakee80c0d32002-07-25 20:13:03 +0000116# XXX This should not be part of site.py, since it is needed even when
117# using the -S option for Python. See http://www.python.org/sf/586680
Brett Cannon0096e262004-06-05 01:12:51 +0000118def addbuilddir():
119 """Append ./build/lib.<platform> in case we're running in the build dir
120 (especially for Guido :-)"""
Tarek Ziadé5633a802010-01-23 09:23:15 +0000121 from sysconfig import get_platform
Jeremy Hylton6d58bf62003-07-18 17:45:33 +0000122 s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
Georg Brandlf00b38e2008-01-21 21:19:07 +0000123 if hasattr(sys, 'gettotalrefcount'):
124 s += '-pydebug'
Florent Xicluna176cda12010-03-22 22:52:11 +0000125 s = os.path.join(os.path.dirname(sys.path.pop()), s)
Guido van Rossum48eb9cd2001-01-19 21:54:59 +0000126 sys.path.append(s)
Guido van Rossum48eb9cd2001-01-19 21:54:59 +0000127
Christian Heimesaf748c32008-05-06 22:41:46 +0000128
Fred Drake7f5296e2001-07-20 20:06:17 +0000129def _init_pathinfo():
Brett Cannon0096e262004-06-05 01:12:51 +0000130 """Return a set containing all existing directory entries from sys.path"""
131 d = set()
Fred Drake7f5296e2001-07-20 20:06:17 +0000132 for dir in sys.path:
Brett Cannon0096e262004-06-05 01:12:51 +0000133 try:
134 if os.path.isdir(dir):
135 dir, dircase = makepath(dir)
136 d.add(dircase)
137 except TypeError:
Fred Drake7f5296e2001-07-20 20:06:17 +0000138 continue
Brett Cannon0096e262004-06-05 01:12:51 +0000139 return d
Fred Drake7f5296e2001-07-20 20:06:17 +0000140
Christian Heimesaf748c32008-05-06 22:41:46 +0000141
Brett Cannon0096e262004-06-05 01:12:51 +0000142def addpackage(sitedir, name, known_paths):
Georg Brandl8d76cca2007-05-19 18:09:26 +0000143 """Process a .pth file within the site-packages directory:
144 For each line in the file, either combine it with sitedir to a path
145 and add that to known_paths, or execute it if it starts with 'import '.
146 """
Brett Cannon0096e262004-06-05 01:12:51 +0000147 if known_paths is None:
Fred Drake7f5296e2001-07-20 20:06:17 +0000148 _init_pathinfo()
149 reset = 1
150 else:
151 reset = 0
Brett Cannon0096e262004-06-05 01:12:51 +0000152 fullname = os.path.join(sitedir, name)
153 try:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000154 f = open(fullname, "rU")
Brett Cannon0096e262004-06-05 01:12:51 +0000155 except IOError:
156 return
Christian Heimesaf748c32008-05-06 22:41:46 +0000157 with f:
Brett Cannon0096e262004-06-05 01:12:51 +0000158 for line in f:
159 if line.startswith("#"):
160 continue
Christian Heimesaf748c32008-05-06 22:41:46 +0000161 if line.startswith(("import ", "import\t")):
Brett Cannon0096e262004-06-05 01:12:51 +0000162 exec line
163 continue
164 line = line.rstrip()
165 dir, dircase = makepath(sitedir, line)
166 if not dircase in known_paths and os.path.exists(dir):
167 sys.path.append(dir)
168 known_paths.add(dircase)
Brett Cannon0096e262004-06-05 01:12:51 +0000169 if reset:
170 known_paths = None
171 return known_paths
172
Christian Heimesaf748c32008-05-06 22:41:46 +0000173
Brett Cannon12f8c4d2004-07-09 23:38:18 +0000174def addsitedir(sitedir, known_paths=None):
Brett Cannon0096e262004-06-05 01:12:51 +0000175 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
176 'sitedir'"""
177 if known_paths is None:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000178 known_paths = _init_pathinfo()
Brett Cannon0096e262004-06-05 01:12:51 +0000179 reset = 1
180 else:
181 reset = 0
Fred Drake1fb5ce02001-07-02 16:55:42 +0000182 sitedir, sitedircase = makepath(sitedir)
Brett Cannon0096e262004-06-05 01:12:51 +0000183 if not sitedircase in known_paths:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000184 sys.path.append(sitedir) # Add path component
Guido van Rossumf30bec71997-08-29 22:30:45 +0000185 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000186 names = os.listdir(sitedir)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000187 except os.error:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000188 return
Christian Heimesaf748c32008-05-06 22:41:46 +0000189 dotpth = os.extsep + "pth"
190 names = [name for name in names if name.endswith(dotpth)]
191 for name in sorted(names):
192 addpackage(sitedir, name, known_paths)
Fred Drake7f5296e2001-07-20 20:06:17 +0000193 if reset:
Brett Cannon0096e262004-06-05 01:12:51 +0000194 known_paths = None
195 return known_paths
Guido van Rossumf30bec71997-08-29 22:30:45 +0000196
Christian Heimesaf748c32008-05-06 22:41:46 +0000197
198def check_enableusersite():
199 """Check if user site directory is safe for inclusion
200
Andrew M. Kuchling5217d5d2008-05-10 17:36:24 +0000201 The function tests for the command line flag (including environment var),
Christian Heimesaf748c32008-05-06 22:41:46 +0000202 process uid/gid equal to effective uid/gid.
203
204 None: Disabled for security reasons
205 False: Disabled by user (command line option)
206 True: Safe and enabled
207 """
208 if sys.flags.no_user_site:
209 return False
210
211 if hasattr(os, "getuid") and hasattr(os, "geteuid"):
212 # check process uid == effective uid
213 if os.geteuid() != os.getuid():
214 return None
215 if hasattr(os, "getgid") and hasattr(os, "getegid"):
216 # check process gid == effective gid
217 if os.getegid() != os.getgid():
218 return None
219
220 return True
221
Tarek Ziadé764fc232009-08-20 21:23:13 +0000222def getuserbase():
223 """Returns the `user base` directory path.
224
225 The `user base` directory can be used to store data. If the global
226 variable ``USER_BASE`` is not initialized yet, this function will also set
227 it.
228 """
229 global USER_BASE
230 if USER_BASE is not None:
231 return USER_BASE
Tarek Ziadé5633a802010-01-23 09:23:15 +0000232 from sysconfig import get_config_var
233 USER_BASE = get_config_var('userbase')
Tarek Ziadé764fc232009-08-20 21:23:13 +0000234 return USER_BASE
235
236def getusersitepackages():
237 """Returns the user-specific site-packages directory path.
238
239 If the global variable ``USER_SITE`` is not initialized yet, this
240 function will also set it.
241 """
242 global USER_SITE
243 user_base = getuserbase() # this will also set USER_BASE
244
245 if USER_SITE is not None:
246 return USER_SITE
247
Tarek Ziadé5633a802010-01-23 09:23:15 +0000248 from sysconfig import get_path
249 import os
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000250
251 if sys.platform == 'darwin':
252 from sysconfig import get_config_var
253 if get_config_var('PYTHONFRAMEWORK'):
254 USER_SITE = get_path('purelib', 'osx_framework_user')
255 return USER_SITE
256
Tarek Ziadé5633a802010-01-23 09:23:15 +0000257 USER_SITE = get_path('purelib', '%s_user' % os.name)
Tarek Ziadé764fc232009-08-20 21:23:13 +0000258 return USER_SITE
Christian Heimesaf748c32008-05-06 22:41:46 +0000259
260def addusersitepackages(known_paths):
261 """Add a per user site-package to sys.path
262
263 Each user has its own python directory with site-packages in the
264 home directory.
Christian Heimesaf748c32008-05-06 22:41:46 +0000265 """
Tarek Ziadé764fc232009-08-20 21:23:13 +0000266 # get the per user site-package path
267 # this call will also make sure USER_BASE and USER_SITE are set
268 user_site = getusersitepackages()
Christian Heimesaf748c32008-05-06 22:41:46 +0000269
Tarek Ziadé764fc232009-08-20 21:23:13 +0000270 if ENABLE_USER_SITE and os.path.isdir(user_site):
271 addsitedir(user_site, known_paths)
Christian Heimesaf748c32008-05-06 22:41:46 +0000272 return known_paths
273
Tarek Ziadé764fc232009-08-20 21:23:13 +0000274def getsitepackages():
275 """Returns a list containing all global site-packages directories
276 (and possibly site-python).
Christian Heimesaf748c32008-05-06 22:41:46 +0000277
Tarek Ziadé764fc232009-08-20 21:23:13 +0000278 For each directory present in the global ``PREFIXES``, this function
279 will find its `site-packages` subdirectory depending on the system
280 environment, and will return a list of full paths.
281 """
282 sitepackages = []
Benjamin Peterson3b959342010-06-03 21:21:03 +0000283 seen = set()
Christian Heimesaf748c32008-05-06 22:41:46 +0000284
285 for prefix in PREFIXES:
286 if not prefix or prefix in seen:
287 continue
Benjamin Peterson3b959342010-06-03 21:21:03 +0000288 seen.add(prefix)
Christian Heimesaf748c32008-05-06 22:41:46 +0000289
290 if sys.platform in ('os2emx', 'riscos'):
Tarek Ziadé764fc232009-08-20 21:23:13 +0000291 sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000292 elif os.sep == '/':
Tarek Ziadé764fc232009-08-20 21:23:13 +0000293 sitepackages.append(os.path.join(prefix, "lib",
Christian Heimesaf748c32008-05-06 22:41:46 +0000294 "python" + sys.version[:3],
295 "site-packages"))
Tarek Ziadé764fc232009-08-20 21:23:13 +0000296 sitepackages.append(os.path.join(prefix, "lib", "site-python"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000297 else:
Tarek Ziadé764fc232009-08-20 21:23:13 +0000298 sitepackages.append(prefix)
299 sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
Christian Heimesaf748c32008-05-06 22:41:46 +0000300 if sys.platform == "darwin":
301 # for framework builds *only* we add the standard Apple
Ronald Oussorene0154ed2009-03-30 23:10:35 +0000302 # locations.
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000303 from sysconfig import get_config_var
304 framework = get_config_var("PYTHONFRAMEWORK")
305 if framework and "/%s.framework/"%(framework,) in prefix:
Tarek Ziadé764fc232009-08-20 21:23:13 +0000306 sitepackages.append(
Ronald Oussoren2f88bfd2010-05-08 10:29:06 +0000307 os.path.join("/Library", framework,
Ronald Oussorene0154ed2009-03-30 23:10:35 +0000308 sys.version[:3], "site-packages"))
Tarek Ziadé764fc232009-08-20 21:23:13 +0000309 return sitepackages
Christian Heimesaf748c32008-05-06 22:41:46 +0000310
Tarek Ziadé764fc232009-08-20 21:23:13 +0000311def addsitepackages(known_paths):
312 """Add site-packages (and possibly site-python) to sys.path"""
313 for sitedir in getsitepackages():
Christian Heimesaf748c32008-05-06 22:41:46 +0000314 if os.path.isdir(sitedir):
315 addsitedir(sitedir, known_paths)
316
317 return known_paths
Fred Drake7f5296e2001-07-20 20:06:17 +0000318
Brett Cannon0096e262004-06-05 01:12:51 +0000319def setBEGINLIBPATH():
320 """The OS/2 EMX port has optional extension modules that do double duty
321 as DLLs (and must use the .DLL file extension) for other extensions.
322 The library search path needs to be amended so these will be found
323 during module import. Use BEGINLIBPATH so that these are at the start
324 of the library search path.
Tim Peters4e0e1b62004-07-07 20:54:48 +0000325
Brett Cannon0096e262004-06-05 01:12:51 +0000326 """
Andrew MacIntyre2e8a6e02003-12-02 12:27:25 +0000327 dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
328 libpath = os.environ['BEGINLIBPATH'].split(';')
329 if libpath[-1]:
330 libpath.append(dllpath)
331 else:
332 libpath[-1] = dllpath
333 os.environ['BEGINLIBPATH'] = ';'.join(libpath)
334
335
Brett Cannon0096e262004-06-05 01:12:51 +0000336def setquit():
Brian Curtinbc96f322010-04-12 23:30:49 +0000337 """Define new builtins 'quit' and 'exit'.
338
339 These are objects which make the interpreter exit when called.
340 The repr of each object contains a hint at how it works.
Guido van Rossumd89fa0c1998-08-07 18:01:14 +0000341
Brett Cannon0096e262004-06-05 01:12:51 +0000342 """
343 if os.sep == ':':
Georg Brandl24cb0532006-03-09 23:22:06 +0000344 eof = 'Cmd-Q'
Brett Cannon0096e262004-06-05 01:12:51 +0000345 elif os.sep == '\\':
Georg Brandl24cb0532006-03-09 23:22:06 +0000346 eof = 'Ctrl-Z plus Return'
Brett Cannon0096e262004-06-05 01:12:51 +0000347 else:
Georg Brandl24cb0532006-03-09 23:22:06 +0000348 eof = 'Ctrl-D (i.e. EOF)'
Tim Peters88ca4672006-03-10 23:39:56 +0000349
Georg Brandl24cb0532006-03-09 23:22:06 +0000350 class Quitter(object):
351 def __init__(self, name):
352 self.name = name
353 def __repr__(self):
354 return 'Use %s() or %s to exit' % (self.name, eof)
355 def __call__(self, code=None):
Kurt B. Kaiserd112bc72006-08-16 05:01:42 +0000356 # Shells like IDLE catch the SystemExit, but listen when their
357 # stdin wrapper is closed.
358 try:
359 sys.stdin.close()
360 except:
361 pass
Georg Brandl24cb0532006-03-09 23:22:06 +0000362 raise SystemExit(code)
363 __builtin__.quit = Quitter('quit')
364 __builtin__.exit = Quitter('exit')
Brett Cannon0096e262004-06-05 01:12:51 +0000365
366
367class _Printer(object):
368 """interactive prompt objects for printing the license text, a list of
369 contributors and the copyright notice."""
370
Guido van Rossumd1252392000-09-05 04:39:55 +0000371 MAXLINES = 23
372
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000373 def __init__(self, name, data, files=(), dirs=()):
374 self.__name = name
375 self.__data = data
376 self.__files = files
377 self.__dirs = dirs
378 self.__lines = None
379
380 def __setup(self):
381 if self.__lines:
382 return
383 data = None
384 for dir in self.__dirs:
Brett Cannon0096e262004-06-05 01:12:51 +0000385 for filename in self.__files:
386 filename = os.path.join(dir, filename)
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000387 try:
Brett Cannon0096e262004-06-05 01:12:51 +0000388 fp = file(filename, "rU")
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000389 data = fp.read()
390 fp.close()
391 break
392 except IOError:
393 pass
394 if data:
395 break
396 if not data:
397 data = self.__data
398 self.__lines = data.split('\n')
Guido van Rossumd1252392000-09-05 04:39:55 +0000399 self.__linecnt = len(self.__lines)
400
401 def __repr__(self):
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000402 self.__setup()
403 if len(self.__lines) <= self.MAXLINES:
404 return "\n".join(self.__lines)
405 else:
406 return "Type %s() to see the full %s text" % ((self.__name,)*2)
407
408 def __call__(self):
409 self.__setup()
Guido van Rossumd1252392000-09-05 04:39:55 +0000410 prompt = 'Hit Return for more, or q (and Return) to quit: '
411 lineno = 0
412 while 1:
413 try:
414 for i in range(lineno, lineno + self.MAXLINES):
415 print self.__lines[i]
416 except IndexError:
417 break
418 else:
419 lineno += self.MAXLINES
420 key = None
421 while key is None:
422 key = raw_input(prompt)
423 if key not in ('', 'q'):
424 key = None
425 if key == 'q':
426 break
Guido van Rossumd1252392000-09-05 04:39:55 +0000427
Brett Cannon0096e262004-06-05 01:12:51 +0000428def setcopyright():
429 """Set 'copyright' and 'credits' in __builtin__"""
430 __builtin__.copyright = _Printer("copyright", sys.copyright)
431 if sys.platform[:4] == 'java':
432 __builtin__.credits = _Printer(
433 "credits",
434 "Jython is maintained by the Jython developers (www.jython.org).")
435 else:
436 __builtin__.credits = _Printer("credits", """\
437 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
438 for supporting Python development. See www.python.org for more information.""")
439 here = os.path.dirname(os.__file__)
440 __builtin__.license = _Printer(
441 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
442 ["LICENSE.txt", "LICENSE"],
443 [os.path.join(here, os.pardir), here, os.curdir])
Guido van Rossumd1252392000-09-05 04:39:55 +0000444
445
Brett Cannon0096e262004-06-05 01:12:51 +0000446class _Helper(object):
Brian Curtinbc96f322010-04-12 23:30:49 +0000447 """Define the builtin 'help'.
Brett Cannon0096e262004-06-05 01:12:51 +0000448 This is a wrapper around pydoc.help (with a twist).
Guido van Rossum83213cc2001-06-12 16:48:52 +0000449
Brett Cannon0096e262004-06-05 01:12:51 +0000450 """
451
Guido van Rossum83213cc2001-06-12 16:48:52 +0000452 def __repr__(self):
453 return "Type help() for interactive help, " \
454 "or help(object) for help about object."
455 def __call__(self, *args, **kwds):
456 import pydoc
457 return pydoc.help(*args, **kwds)
458
Brett Cannon0096e262004-06-05 01:12:51 +0000459def sethelper():
460 __builtin__.help = _Helper()
461
462def aliasmbcs():
463 """On Windows, some default encodings are not provided by Python,
464 while they are always available as "mbcs" in each locale. Make
465 them usable by aliasing to "mbcs" in such a case."""
466 if sys.platform == 'win32':
467 import locale, codecs
468 enc = locale.getdefaultlocale()[1]
469 if enc.startswith('cp'): # "cp***" ?
470 try:
471 codecs.lookup(enc)
472 except LookupError:
473 import encodings
474 encodings._cache[enc] = encodings._unknown
475 encodings.aliases.aliases[enc] = 'mbcs'
476
477def setencoding():
478 """Set the string encoding used by the Unicode implementation. The
479 default is 'ascii', but if you're willing to experiment, you can
480 change this."""
481 encoding = "ascii" # Default value set by _PyUnicode_Init()
482 if 0:
483 # Enable to support locale aware default string encodings.
484 import locale
485 loc = locale.getdefaultlocale()
486 if loc[1]:
487 encoding = loc[1]
488 if 0:
489 # Enable to switch off string to Unicode coercion and implicit
490 # Unicode to string conversion.
491 encoding = "undefined"
492 if encoding != "ascii":
493 # On Non-Unicode builds this will raise an AttributeError...
494 sys.setdefaultencoding(encoding) # Needs Python Unicode build !
Guido van Rossum83213cc2001-06-12 16:48:52 +0000495
496
Brett Cannon0096e262004-06-05 01:12:51 +0000497def execsitecustomize():
498 """Run custom site specific code, if available."""
499 try:
500 import sitecustomize
501 except ImportError:
502 pass
Victor Stinner66644262010-03-10 22:30:19 +0000503 except Exception:
504 if sys.flags.verbose:
505 sys.excepthook(*sys.exc_info())
506 else:
507 print >>sys.stderr, \
508 "'import sitecustomize' failed; use -v for traceback"
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000509
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000510
Christian Heimesaf748c32008-05-06 22:41:46 +0000511def execusercustomize():
512 """Run custom user specific code, if available."""
513 try:
514 import usercustomize
515 except ImportError:
516 pass
Victor Stinner66644262010-03-10 22:30:19 +0000517 except Exception:
518 if sys.flags.verbose:
519 sys.excepthook(*sys.exc_info())
520 else:
521 print>>sys.stderr, \
Victor Stinner3ec32002010-03-10 22:45:04 +0000522 "'import usercustomize' failed; use -v for traceback"
Christian Heimesaf748c32008-05-06 22:41:46 +0000523
524
Brett Cannon0096e262004-06-05 01:12:51 +0000525def main():
Christian Heimesaf748c32008-05-06 22:41:46 +0000526 global ENABLE_USER_SITE
527
Brett Cannon0096e262004-06-05 01:12:51 +0000528 abs__file__()
Christian Heimesaf748c32008-05-06 22:41:46 +0000529 known_paths = removeduppaths()
Brett Cannon0096e262004-06-05 01:12:51 +0000530 if (os.name == "posix" and sys.path and
531 os.path.basename(sys.path[-1]) == "Modules"):
532 addbuilddir()
Christian Heimesaf748c32008-05-06 22:41:46 +0000533 if ENABLE_USER_SITE is None:
534 ENABLE_USER_SITE = check_enableusersite()
535 known_paths = addusersitepackages(known_paths)
536 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000537 if sys.platform == 'os2emx':
538 setBEGINLIBPATH()
539 setquit()
540 setcopyright()
541 sethelper()
542 aliasmbcs()
543 setencoding()
544 execsitecustomize()
Christian Heimesaf748c32008-05-06 22:41:46 +0000545 if ENABLE_USER_SITE:
546 execusercustomize()
Brett Cannon0096e262004-06-05 01:12:51 +0000547 # Remove sys.setdefaultencoding() so that users cannot change the
548 # encoding after initialization. The test for presence is needed when
549 # this module is run as a script, because this code is executed twice.
550 if hasattr(sys, "setdefaultencoding"):
551 del sys.setdefaultencoding
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000552
Brett Cannon0096e262004-06-05 01:12:51 +0000553main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000554
Christian Heimesaf748c32008-05-06 22:41:46 +0000555def _script():
556 help = """\
557 %s [--user-base] [--user-site]
558
559 Without arguments print some useful information
560 With arguments print the value of USER_BASE and/or USER_SITE separated
561 by '%s'.
562
563 Exit codes with --user-base or --user-site:
564 0 - user site directory is enabled
Christian Heimes17433d22008-05-09 12:19:09 +0000565 1 - user site directory is disabled by user
Christian Heimesaf748c32008-05-06 22:41:46 +0000566 2 - uses site directory is disabled by super user
567 or for security reasons
568 >2 - unknown error
569 """
570 args = sys.argv[1:]
571 if not args:
572 print "sys.path = ["
573 for dir in sys.path:
574 print " %r," % (dir,)
575 print "]"
576 print "USER_BASE: %r (%s)" % (USER_BASE,
577 "exists" if os.path.isdir(USER_BASE) else "doesn't exist")
578 print "USER_SITE: %r (%s)" % (USER_SITE,
579 "exists" if os.path.isdir(USER_SITE) else "doesn't exist")
580 print "ENABLE_USER_SITE: %r" % ENABLE_USER_SITE
581 sys.exit(0)
582
583 buffer = []
584 if '--user-base' in args:
585 buffer.append(USER_BASE)
586 if '--user-site' in args:
587 buffer.append(USER_SITE)
588
589 if buffer:
590 print os.pathsep.join(buffer)
591 if ENABLE_USER_SITE:
592 sys.exit(0)
593 elif ENABLE_USER_SITE is False:
594 sys.exit(1)
595 elif ENABLE_USER_SITE is None:
596 sys.exit(2)
597 else:
598 sys.exit(3)
599 else:
600 import textwrap
601 print textwrap.dedent(help % (sys.argv[0], os.pathsep))
602 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000603
604if __name__ == '__main__':
Christian Heimesaf748c32008-05-06 22:41:46 +0000605 _script()