blob: 51516aa914e8de9a9dc23d51b7f45db0c29ef924 [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
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +00007This will append site-specific paths to the module search path. On
Thomas Wouters0e3f5912006-08-11 14:57:12 +00008Unix (including Mac OSX), it starts with sys.prefix and
9sys.exec_prefix (if different) and appends
10lib/python<version>/site-packages as well as lib/site-python.
11On other platforms (such as Windows), it tries each of the
12prefixes directly, as well as with lib/site-packages appended. The
Guido van Rossum62b297b1997-09-08 02:14:09 +000013resulting directories, if they exist, are appended to sys.path, and
14also inspected for path configuration files.
Guido van Rossume57c96e1996-08-17 19:56:26 +000015
Guido van Rossumf30bec71997-08-29 22:30:45 +000016A path configuration file is a file whose name has the form
17<package>.pth; its contents are additional directories (one per line)
18to be added to sys.path. Non-existing directories (or
19non-directories) are never added to sys.path; no directory is added to
20sys.path more than once. Blank lines and lines beginning with
Guido van Rossumfacf24b2001-12-17 16:07:06 +000021'#' are skipped. Lines starting with 'import' are executed.
Guido van Rossume57c96e1996-08-17 19:56:26 +000022
Guido van Rossumf30bec71997-08-29 22:30:45 +000023For example, suppose sys.prefix and sys.exec_prefix are set to
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000024/usr/local and there is a directory /usr/local/lib/python2.5/site-packages
Guido van Rossum62b297b1997-09-08 02:14:09 +000025with three subdirectories, foo, bar and spam, and two path
26configuration files, foo.pth and bar.pth. Assume foo.pth contains the
27following:
Guido van Rossumf30bec71997-08-29 22:30:45 +000028
29 # foo package configuration
30 foo
31 bar
32 bletch
33
34and bar.pth contains:
35
36 # bar package configuration
37 bar
38
39Then the following directories are added to sys.path, in this order:
40
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000041 /usr/local/lib/python2.5/site-packages/bar
42 /usr/local/lib/python2.5/site-packages/foo
Guido van Rossumf30bec71997-08-29 22:30:45 +000043
44Note that bletch is omitted because it doesn't exist; bar precedes foo
45because bar.pth comes alphabetically before foo.pth; and spam is
46omitted because it is not mentioned in either path configuration file.
Guido van Rossume57c96e1996-08-17 19:56:26 +000047
48After these path manipulations, an attempt is made to import a module
Guido van Rossumf30bec71997-08-29 22:30:45 +000049named sitecustomize, which can perform arbitrary additional
50site-specific customizations. If this import fails with an
51ImportError exception, it is silently ignored.
Guido van Rossume57c96e1996-08-17 19:56:26 +000052
Guido van Rossume57c96e1996-08-17 19:56:26 +000053"""
54
Brett Cannon0096e262004-06-05 01:12:51 +000055import sys
56import os
Georg Brandl1a3284e2007-12-02 09:40:06 +000057import builtins
Guido van Rossume57c96e1996-08-17 19:56:26 +000058
Christian Heimes8dc226f2008-05-06 23:45:46 +000059# Prefixes for site-packages; add additional prefixes like /usr/local here
60PREFIXES = [sys.prefix, sys.exec_prefix]
61# Enable per user site-packages directory
62# set it to False to disable the feature or True to force the feature
63ENABLE_USER_SITE = None
Tarek Ziadé4a608c02009-08-20 21:28:05 +000064
Christian Heimes8dc226f2008-05-06 23:45:46 +000065# for distutils.commands.install
Tarek Ziadé4a608c02009-08-20 21:28:05 +000066# These values are initialized by the getuserbase() and getusersitepackages()
67# functions, through the main() function when Python starts.
Christian Heimes8dc226f2008-05-06 23:45:46 +000068USER_SITE = None
69USER_BASE = None
70
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000071
Fred Drake38cb9f12000-09-28 16:52:36 +000072def makepath(*paths):
Fred Drake1fb5ce02001-07-02 16:55:42 +000073 dir = os.path.abspath(os.path.join(*paths))
74 return dir, os.path.normcase(dir)
Fred Drake38cb9f12000-09-28 16:52:36 +000075
Christian Heimes8dc226f2008-05-06 23:45:46 +000076
Barry Warsaw28a691b2010-04-17 00:19:56 +000077def abs_paths():
78 """Set all module __file__ and __cached__ attributes to an absolute path"""
Guido van Rossum7ac9d402007-05-18 00:24:43 +000079 for m in set(sys.modules.values()):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000080 if hasattr(m, '__loader__'):
81 continue # don't mess with a PEP 302-supplied __file__
Brett Cannon0096e262004-06-05 01:12:51 +000082 try:
83 m.__file__ = os.path.abspath(m.__file__)
84 except AttributeError:
Barry Warsaw28a691b2010-04-17 00:19:56 +000085 pass
86 try:
87 m.__cached__ = os.path.abspath(m.__cached__)
88 except AttributeError:
89 pass
Fred Drake38cb9f12000-09-28 16:52:36 +000090
Christian Heimes8dc226f2008-05-06 23:45:46 +000091
Brett Cannon0096e262004-06-05 01:12:51 +000092def removeduppaths():
93 """ Remove duplicate entries from sys.path along with making them
94 absolute"""
95 # This ensures that the initial path provided by the interpreter contains
96 # only absolute pathnames, even if we're running from the build directory.
97 L = []
98 known_paths = set()
99 for dir in sys.path:
100 # Filter out duplicate paths (on case-insensitive file systems also
101 # if they only differ in case); turn relative paths into absolute
102 # paths.
103 dir, dircase = makepath(dir)
104 if not dircase in known_paths:
105 L.append(dir)
106 known_paths.add(dircase)
107 sys.path[:] = L
108 return known_paths
Fred Drake38cb9f12000-09-28 16:52:36 +0000109
Christian Heimes8dc226f2008-05-06 23:45:46 +0000110
Fred Drake7f5296e2001-07-20 20:06:17 +0000111def _init_pathinfo():
Brett Cannon0096e262004-06-05 01:12:51 +0000112 """Return a set containing all existing directory entries from sys.path"""
113 d = set()
Fred Drake7f5296e2001-07-20 20:06:17 +0000114 for dir in sys.path:
Brett Cannon0096e262004-06-05 01:12:51 +0000115 try:
116 if os.path.isdir(dir):
117 dir, dircase = makepath(dir)
118 d.add(dircase)
119 except TypeError:
Fred Drake7f5296e2001-07-20 20:06:17 +0000120 continue
Brett Cannon0096e262004-06-05 01:12:51 +0000121 return d
Fred Drake7f5296e2001-07-20 20:06:17 +0000122
Christian Heimes8dc226f2008-05-06 23:45:46 +0000123
Brett Cannon0096e262004-06-05 01:12:51 +0000124def addpackage(sitedir, name, known_paths):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000125 """Process a .pth file within the site-packages directory:
126 For each line in the file, either combine it with sitedir to a path
127 and add that to known_paths, or execute it if it starts with 'import '.
128 """
Brett Cannon0096e262004-06-05 01:12:51 +0000129 if known_paths is None:
Fred Drake7f5296e2001-07-20 20:06:17 +0000130 _init_pathinfo()
131 reset = 1
132 else:
133 reset = 0
Brett Cannon0096e262004-06-05 01:12:51 +0000134 fullname = os.path.join(sitedir, name)
135 try:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000136 f = open(fullname, "rU")
Brett Cannon0096e262004-06-05 01:12:51 +0000137 except IOError:
138 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000139 with f:
Brett Cannon0096e262004-06-05 01:12:51 +0000140 for line in f:
141 if line.startswith("#"):
142 continue
Christian Heimes8dc226f2008-05-06 23:45:46 +0000143 if line.startswith(("import ", "import\t")):
Georg Brandl7cae87c2006-09-06 06:51:57 +0000144 exec(line)
Brett Cannon0096e262004-06-05 01:12:51 +0000145 continue
146 line = line.rstrip()
147 dir, dircase = makepath(sitedir, line)
148 if not dircase in known_paths and os.path.exists(dir):
149 sys.path.append(dir)
150 known_paths.add(dircase)
Brett Cannon0096e262004-06-05 01:12:51 +0000151 if reset:
152 known_paths = None
153 return known_paths
154
Christian Heimes8dc226f2008-05-06 23:45:46 +0000155
Brett Cannon12f8c4d2004-07-09 23:38:18 +0000156def addsitedir(sitedir, known_paths=None):
Brett Cannon0096e262004-06-05 01:12:51 +0000157 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
158 'sitedir'"""
159 if known_paths is None:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000160 known_paths = _init_pathinfo()
Brett Cannon0096e262004-06-05 01:12:51 +0000161 reset = 1
162 else:
163 reset = 0
Fred Drake1fb5ce02001-07-02 16:55:42 +0000164 sitedir, sitedircase = makepath(sitedir)
Brett Cannon0096e262004-06-05 01:12:51 +0000165 if not sitedircase in known_paths:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000166 sys.path.append(sitedir) # Add path component
Guido van Rossumf30bec71997-08-29 22:30:45 +0000167 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000168 names = os.listdir(sitedir)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000169 except os.error:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000170 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000171 names = [name for name in names if name.endswith(".pth")]
172 for name in sorted(names):
173 addpackage(sitedir, name, known_paths)
Fred Drake7f5296e2001-07-20 20:06:17 +0000174 if reset:
Brett Cannon0096e262004-06-05 01:12:51 +0000175 known_paths = None
176 return known_paths
Guido van Rossumf30bec71997-08-29 22:30:45 +0000177
Christian Heimes8dc226f2008-05-06 23:45:46 +0000178
179def check_enableusersite():
180 """Check if user site directory is safe for inclusion
181
Alexandre Vassalottia79e33e2008-05-15 22:51:26 +0000182 The function tests for the command line flag (including environment var),
Christian Heimes8dc226f2008-05-06 23:45:46 +0000183 process uid/gid equal to effective uid/gid.
184
185 None: Disabled for security reasons
186 False: Disabled by user (command line option)
187 True: Safe and enabled
188 """
189 if sys.flags.no_user_site:
190 return False
191
192 if hasattr(os, "getuid") and hasattr(os, "geteuid"):
193 # check process uid == effective uid
194 if os.geteuid() != os.getuid():
195 return None
196 if hasattr(os, "getgid") and hasattr(os, "getegid"):
197 # check process gid == effective gid
198 if os.getegid() != os.getgid():
199 return None
200
201 return True
202
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000203def getuserbase():
204 """Returns the `user base` directory path.
205
206 The `user base` directory can be used to store data. If the global
207 variable ``USER_BASE`` is not initialized yet, this function will also set
208 it.
209 """
210 global USER_BASE
211 if USER_BASE is not None:
212 return USER_BASE
Tarek Ziadéedacea32010-01-29 11:41:03 +0000213 from sysconfig import get_config_var
214 USER_BASE = get_config_var('userbase')
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000215 return USER_BASE
216
217def getusersitepackages():
218 """Returns the user-specific site-packages directory path.
219
220 If the global variable ``USER_SITE`` is not initialized yet, this
221 function will also set it.
222 """
223 global USER_SITE
224 user_base = getuserbase() # this will also set USER_BASE
225
226 if USER_SITE is not None:
227 return USER_SITE
228
Tarek Ziadéedacea32010-01-29 11:41:03 +0000229 from sysconfig import get_path
230 import os
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000231
232 if sys.platform == 'darwin':
233 from sysconfig import get_config_var
234 if get_config_var('PYTHONFRAMEWORK'):
235 USER_SITE = get_path('purelib', 'osx_framework_user')
236 return USER_SITE
237
Tarek Ziadéedacea32010-01-29 11:41:03 +0000238 USER_SITE = get_path('purelib', '%s_user' % os.name)
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000239 return USER_SITE
Christian Heimes8dc226f2008-05-06 23:45:46 +0000240
241def addusersitepackages(known_paths):
242 """Add a per user site-package to sys.path
243
244 Each user has its own python directory with site-packages in the
245 home directory.
Christian Heimes8dc226f2008-05-06 23:45:46 +0000246 """
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000247 # get the per user site-package path
248 # this call will also make sure USER_BASE and USER_SITE are set
249 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000250
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000251 if ENABLE_USER_SITE and os.path.isdir(user_site):
252 addsitedir(user_site, known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000253 return known_paths
254
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000255def getsitepackages():
256 """Returns a list containing all global site-packages directories
257 (and possibly site-python).
Christian Heimes8dc226f2008-05-06 23:45:46 +0000258
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000259 For each directory present in the global ``PREFIXES``, this function
260 will find its `site-packages` subdirectory depending on the system
261 environment, and will return a list of full paths.
262 """
263 sitepackages = []
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000264 seen = set()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000265
266 for prefix in PREFIXES:
267 if not prefix or prefix in seen:
268 continue
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000269 seen.add(prefix)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000270
271 if sys.platform in ('os2emx', 'riscos'):
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000272 sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000273 elif os.sep == '/':
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000274 sitepackages.append(os.path.join(prefix, "lib",
Christian Heimes8dc226f2008-05-06 23:45:46 +0000275 "python" + sys.version[:3],
276 "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000277 sitepackages.append(os.path.join(prefix, "lib", "site-python"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000278 else:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000279 sitepackages.append(prefix)
280 sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000281 if sys.platform == "darwin":
282 # for framework builds *only* we add the standard Apple
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000283 # locations.
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000284 from sysconfig import get_config_var
285 framework = get_config_var("PYTHONFRAMEWORK")
Ronald Oussorenbda46722010-08-01 09:02:50 +0000286 if framework:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000287 sitepackages.append(
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000288 os.path.join("/Library", framework,
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000289 sys.version[:3], "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000290 return sitepackages
Christian Heimes8dc226f2008-05-06 23:45:46 +0000291
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000292def addsitepackages(known_paths):
293 """Add site-packages (and possibly site-python) to sys.path"""
294 for sitedir in getsitepackages():
Christian Heimes8dc226f2008-05-06 23:45:46 +0000295 if os.path.isdir(sitedir):
296 addsitedir(sitedir, known_paths)
297
298 return known_paths
Fred Drake7f5296e2001-07-20 20:06:17 +0000299
Brett Cannon0096e262004-06-05 01:12:51 +0000300def setBEGINLIBPATH():
301 """The OS/2 EMX port has optional extension modules that do double duty
302 as DLLs (and must use the .DLL file extension) for other extensions.
303 The library search path needs to be amended so these will be found
304 during module import. Use BEGINLIBPATH so that these are at the start
305 of the library search path.
Tim Peters4e0e1b62004-07-07 20:54:48 +0000306
Brett Cannon0096e262004-06-05 01:12:51 +0000307 """
Andrew MacIntyre2e8a6e02003-12-02 12:27:25 +0000308 dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
309 libpath = os.environ['BEGINLIBPATH'].split(';')
310 if libpath[-1]:
311 libpath.append(dllpath)
312 else:
313 libpath[-1] = dllpath
314 os.environ['BEGINLIBPATH'] = ';'.join(libpath)
315
316
Brett Cannon0096e262004-06-05 01:12:51 +0000317def setquit():
Brian Curtinfb1d3c12010-04-12 23:33:42 +0000318 """Define new builtins 'quit' and 'exit'.
319
320 These are objects which make the interpreter exit when called.
321 The repr of each object contains a hint at how it works.
Guido van Rossumd89fa0c1998-08-07 18:01:14 +0000322
Brett Cannon0096e262004-06-05 01:12:51 +0000323 """
324 if os.sep == ':':
Georg Brandl24cb0532006-03-09 23:22:06 +0000325 eof = 'Cmd-Q'
Brett Cannon0096e262004-06-05 01:12:51 +0000326 elif os.sep == '\\':
Georg Brandl24cb0532006-03-09 23:22:06 +0000327 eof = 'Ctrl-Z plus Return'
Brett Cannon0096e262004-06-05 01:12:51 +0000328 else:
Georg Brandl24cb0532006-03-09 23:22:06 +0000329 eof = 'Ctrl-D (i.e. EOF)'
Tim Peters88ca4672006-03-10 23:39:56 +0000330
Georg Brandl24cb0532006-03-09 23:22:06 +0000331 class Quitter(object):
332 def __init__(self, name):
333 self.name = name
334 def __repr__(self):
335 return 'Use %s() or %s to exit' % (self.name, eof)
336 def __call__(self, code=None):
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000337 # Shells like IDLE catch the SystemExit, but listen when their
338 # stdin wrapper is closed.
339 try:
Christian Heimes862543a2007-12-31 03:07:24 +0000340 fd = -1
341 if hasattr(sys.stdin, "fileno"):
342 fd = sys.stdin.fileno()
343 if fd != 0:
344 # Don't close stdin if it wraps fd 0
345 sys.stdin.close()
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000346 except:
347 pass
Georg Brandl24cb0532006-03-09 23:22:06 +0000348 raise SystemExit(code)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000349 builtins.quit = Quitter('quit')
350 builtins.exit = Quitter('exit')
Brett Cannon0096e262004-06-05 01:12:51 +0000351
352
353class _Printer(object):
354 """interactive prompt objects for printing the license text, a list of
355 contributors and the copyright notice."""
356
Guido van Rossumd1252392000-09-05 04:39:55 +0000357 MAXLINES = 23
358
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000359 def __init__(self, name, data, files=(), dirs=()):
360 self.__name = name
361 self.__data = data
362 self.__files = files
363 self.__dirs = dirs
364 self.__lines = None
365
366 def __setup(self):
367 if self.__lines:
368 return
369 data = None
370 for dir in self.__dirs:
Brett Cannon0096e262004-06-05 01:12:51 +0000371 for filename in self.__files:
372 filename = os.path.join(dir, filename)
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000373 try:
Alex Martelli01c77c62006-08-24 02:58:11 +0000374 fp = open(filename, "rU")
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000375 data = fp.read()
376 fp.close()
377 break
378 except IOError:
379 pass
380 if data:
381 break
382 if not data:
383 data = self.__data
384 self.__lines = data.split('\n')
Guido van Rossumd1252392000-09-05 04:39:55 +0000385 self.__linecnt = len(self.__lines)
386
387 def __repr__(self):
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000388 self.__setup()
389 if len(self.__lines) <= self.MAXLINES:
390 return "\n".join(self.__lines)
391 else:
392 return "Type %s() to see the full %s text" % ((self.__name,)*2)
393
394 def __call__(self):
395 self.__setup()
Guido van Rossumd1252392000-09-05 04:39:55 +0000396 prompt = 'Hit Return for more, or q (and Return) to quit: '
397 lineno = 0
398 while 1:
399 try:
400 for i in range(lineno, lineno + self.MAXLINES):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000401 print(self.__lines[i])
Guido van Rossumd1252392000-09-05 04:39:55 +0000402 except IndexError:
403 break
404 else:
405 lineno += self.MAXLINES
406 key = None
407 while key is None:
Guido van Rossum704b34d2007-12-20 18:42:56 +0000408 key = input(prompt)
Guido van Rossumd1252392000-09-05 04:39:55 +0000409 if key not in ('', 'q'):
410 key = None
411 if key == 'q':
412 break
Guido van Rossumd1252392000-09-05 04:39:55 +0000413
Brett Cannon0096e262004-06-05 01:12:51 +0000414def setcopyright():
Georg Brandl1a3284e2007-12-02 09:40:06 +0000415 """Set 'copyright' and 'credits' in builtins"""
416 builtins.copyright = _Printer("copyright", sys.copyright)
Brett Cannon0096e262004-06-05 01:12:51 +0000417 if sys.platform[:4] == 'java':
Georg Brandl1a3284e2007-12-02 09:40:06 +0000418 builtins.credits = _Printer(
Brett Cannon0096e262004-06-05 01:12:51 +0000419 "credits",
420 "Jython is maintained by the Jython developers (www.jython.org).")
421 else:
Georg Brandl1a3284e2007-12-02 09:40:06 +0000422 builtins.credits = _Printer("credits", """\
Brett Cannon0096e262004-06-05 01:12:51 +0000423 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
424 for supporting Python development. See www.python.org for more information.""")
425 here = os.path.dirname(os.__file__)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000426 builtins.license = _Printer(
Brett Cannon0096e262004-06-05 01:12:51 +0000427 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
428 ["LICENSE.txt", "LICENSE"],
429 [os.path.join(here, os.pardir), here, os.curdir])
Guido van Rossumd1252392000-09-05 04:39:55 +0000430
431
Brett Cannon0096e262004-06-05 01:12:51 +0000432class _Helper(object):
Brian Curtinfb1d3c12010-04-12 23:33:42 +0000433 """Define the builtin 'help'.
Brett Cannon0096e262004-06-05 01:12:51 +0000434 This is a wrapper around pydoc.help (with a twist).
Guido van Rossum83213cc2001-06-12 16:48:52 +0000435
Brett Cannon0096e262004-06-05 01:12:51 +0000436 """
437
Guido van Rossum83213cc2001-06-12 16:48:52 +0000438 def __repr__(self):
439 return "Type help() for interactive help, " \
440 "or help(object) for help about object."
441 def __call__(self, *args, **kwds):
442 import pydoc
443 return pydoc.help(*args, **kwds)
444
Brett Cannon0096e262004-06-05 01:12:51 +0000445def sethelper():
Georg Brandl1a3284e2007-12-02 09:40:06 +0000446 builtins.help = _Helper()
Brett Cannon0096e262004-06-05 01:12:51 +0000447
448def aliasmbcs():
449 """On Windows, some default encodings are not provided by Python,
450 while they are always available as "mbcs" in each locale. Make
451 them usable by aliasing to "mbcs" in such a case."""
452 if sys.platform == 'win32':
453 import locale, codecs
454 enc = locale.getdefaultlocale()[1]
455 if enc.startswith('cp'): # "cp***" ?
456 try:
457 codecs.lookup(enc)
458 except LookupError:
459 import encodings
460 encodings._cache[enc] = encodings._unknown
461 encodings.aliases.aliases[enc] = 'mbcs'
462
Guido van Rossum83213cc2001-06-12 16:48:52 +0000463
Brett Cannon0096e262004-06-05 01:12:51 +0000464def execsitecustomize():
465 """Run custom site specific code, if available."""
466 try:
467 import sitecustomize
468 except ImportError:
469 pass
Guido van Rossumb940e112007-01-10 16:19:56 +0000470 except Exception as err:
Guido van Rossumc6fe9832006-08-19 00:10:28 +0000471 if os.environ.get("PYTHONVERBOSE"):
Victor Stinner52f6dd72010-03-12 14:45:56 +0000472 sys.excepthook(*sys.exc_info())
473 else:
474 sys.stderr.write(
475 "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
476 "%s: %s\n" %
477 (err.__class__.__name__, err))
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000478
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000479
Christian Heimes8dc226f2008-05-06 23:45:46 +0000480def execusercustomize():
481 """Run custom user specific code, if available."""
482 try:
483 import usercustomize
484 except ImportError:
485 pass
Victor Stinner52f6dd72010-03-12 14:45:56 +0000486 except Exception as err:
487 if os.environ.get("PYTHONVERBOSE"):
488 sys.excepthook(*sys.exc_info())
489 else:
490 sys.stderr.write(
491 "Error in usercustomize; set PYTHONVERBOSE for traceback:\n"
492 "%s: %s\n" %
493 (err.__class__.__name__, err))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000494
495
Brett Cannon0096e262004-06-05 01:12:51 +0000496def main():
Christian Heimes8dc226f2008-05-06 23:45:46 +0000497 global ENABLE_USER_SITE
498
Barry Warsaw28a691b2010-04-17 00:19:56 +0000499 abs_paths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000500 known_paths = removeduppaths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000501 if ENABLE_USER_SITE is None:
502 ENABLE_USER_SITE = check_enableusersite()
503 known_paths = addusersitepackages(known_paths)
504 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000505 if sys.platform == 'os2emx':
506 setBEGINLIBPATH()
507 setquit()
508 setcopyright()
509 sethelper()
510 aliasmbcs()
Brett Cannon0096e262004-06-05 01:12:51 +0000511 execsitecustomize()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000512 if ENABLE_USER_SITE:
513 execusercustomize()
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000514
Brett Cannon0096e262004-06-05 01:12:51 +0000515main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000516
Christian Heimes8dc226f2008-05-06 23:45:46 +0000517def _script():
518 help = """\
519 %s [--user-base] [--user-site]
520
521 Without arguments print some useful information
522 With arguments print the value of USER_BASE and/or USER_SITE separated
523 by '%s'.
524
525 Exit codes with --user-base or --user-site:
526 0 - user site directory is enabled
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000527 1 - user site directory is disabled by user
Christian Heimes8dc226f2008-05-06 23:45:46 +0000528 2 - uses site directory is disabled by super user
529 or for security reasons
530 >2 - unknown error
531 """
532 args = sys.argv[1:]
533 if not args:
534 print("sys.path = [")
535 for dir in sys.path:
536 print(" %r," % (dir,))
537 print("]")
538 print("USER_BASE: %r (%s)" % (USER_BASE,
539 "exists" if os.path.isdir(USER_BASE) else "doesn't exist"))
540 print("USER_SITE: %r (%s)" % (USER_SITE,
541 "exists" if os.path.isdir(USER_SITE) else "doesn't exist"))
542 print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
543 sys.exit(0)
544
545 buffer = []
546 if '--user-base' in args:
547 buffer.append(USER_BASE)
548 if '--user-site' in args:
549 buffer.append(USER_SITE)
550
551 if buffer:
552 print(os.pathsep.join(buffer))
553 if ENABLE_USER_SITE:
554 sys.exit(0)
555 elif ENABLE_USER_SITE is False:
556 sys.exit(1)
557 elif ENABLE_USER_SITE is None:
558 sys.exit(2)
559 else:
560 sys.exit(3)
561 else:
562 import textwrap
563 print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
564 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000565
566if __name__ == '__main__':
Christian Heimes8dc226f2008-05-06 23:45:46 +0000567 _script()