blob: c289f565f93149dc7cd0161a0dbd142b0f306231 [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):
Victor Stinnerb103a932010-10-12 22:23:23 +000073 dir = os.path.join(*paths)
74 try:
75 dir = os.path.abspath(dir)
76 except OSError:
77 pass
Fred Drake1fb5ce02001-07-02 16:55:42 +000078 return dir, os.path.normcase(dir)
Fred Drake38cb9f12000-09-28 16:52:36 +000079
Christian Heimes8dc226f2008-05-06 23:45:46 +000080
Barry Warsaw28a691b2010-04-17 00:19:56 +000081def abs_paths():
82 """Set all module __file__ and __cached__ attributes to an absolute path"""
Guido van Rossum7ac9d402007-05-18 00:24:43 +000083 for m in set(sys.modules.values()):
Brett Cannonfd074152012-04-14 14:10:13 -040084 if (getattr(getattr(m, '__loader__', None), '__module__', None) !=
85 '_frozen_importlib'):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000086 continue # don't mess with a PEP 302-supplied __file__
Brett Cannon0096e262004-06-05 01:12:51 +000087 try:
88 m.__file__ = os.path.abspath(m.__file__)
Victor Stinnerb103a932010-10-12 22:23:23 +000089 except (AttributeError, OSError):
Barry Warsaw28a691b2010-04-17 00:19:56 +000090 pass
91 try:
92 m.__cached__ = os.path.abspath(m.__cached__)
Victor Stinnerb103a932010-10-12 22:23:23 +000093 except (AttributeError, OSError):
Barry Warsaw28a691b2010-04-17 00:19:56 +000094 pass
Fred Drake38cb9f12000-09-28 16:52:36 +000095
Christian Heimes8dc226f2008-05-06 23:45:46 +000096
Brett Cannon0096e262004-06-05 01:12:51 +000097def removeduppaths():
98 """ Remove duplicate entries from sys.path along with making them
99 absolute"""
100 # This ensures that the initial path provided by the interpreter contains
101 # only absolute pathnames, even if we're running from the build directory.
102 L = []
103 known_paths = set()
104 for dir in sys.path:
105 # Filter out duplicate paths (on case-insensitive file systems also
106 # if they only differ in case); turn relative paths into absolute
107 # paths.
108 dir, dircase = makepath(dir)
109 if not dircase in known_paths:
110 L.append(dir)
111 known_paths.add(dircase)
112 sys.path[:] = L
113 return known_paths
Fred Drake38cb9f12000-09-28 16:52:36 +0000114
Christian Heimes8dc226f2008-05-06 23:45:46 +0000115
Fred Drake7f5296e2001-07-20 20:06:17 +0000116def _init_pathinfo():
Brett Cannon0096e262004-06-05 01:12:51 +0000117 """Return a set containing all existing directory entries from sys.path"""
118 d = set()
Fred Drake7f5296e2001-07-20 20:06:17 +0000119 for dir in sys.path:
Brett Cannon0096e262004-06-05 01:12:51 +0000120 try:
121 if os.path.isdir(dir):
122 dir, dircase = makepath(dir)
123 d.add(dircase)
124 except TypeError:
Fred Drake7f5296e2001-07-20 20:06:17 +0000125 continue
Brett Cannon0096e262004-06-05 01:12:51 +0000126 return d
Fred Drake7f5296e2001-07-20 20:06:17 +0000127
Christian Heimes8dc226f2008-05-06 23:45:46 +0000128
Brett Cannon0096e262004-06-05 01:12:51 +0000129def addpackage(sitedir, name, known_paths):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000130 """Process a .pth file within the site-packages directory:
131 For each line in the file, either combine it with sitedir to a path
132 and add that to known_paths, or execute it if it starts with 'import '.
133 """
Brett Cannon0096e262004-06-05 01:12:51 +0000134 if known_paths is None:
Fred Drake7f5296e2001-07-20 20:06:17 +0000135 _init_pathinfo()
136 reset = 1
137 else:
138 reset = 0
Brett Cannon0096e262004-06-05 01:12:51 +0000139 fullname = os.path.join(sitedir, name)
140 try:
Victor Stinner4e86d5b2011-05-04 13:55:36 +0200141 f = open(fullname, "r")
Brett Cannon0096e262004-06-05 01:12:51 +0000142 except IOError:
143 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000144 with f:
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000145 for n, line in enumerate(f):
Brett Cannon0096e262004-06-05 01:12:51 +0000146 if line.startswith("#"):
147 continue
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000148 try:
149 if line.startswith(("import ", "import\t")):
150 exec(line)
151 continue
152 line = line.rstrip()
153 dir, dircase = makepath(sitedir, line)
154 if not dircase in known_paths and os.path.exists(dir):
155 sys.path.append(dir)
156 known_paths.add(dircase)
Florent Xicluna54540ec2011-11-04 08:29:17 +0100157 except Exception:
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000158 print("Error processing line {:d} of {}:\n".format(n+1, fullname),
159 file=sys.stderr)
Victor Stinner65532112012-02-21 22:10:16 +0100160 import traceback
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000161 for record in traceback.format_exception(*sys.exc_info()):
162 for line in record.splitlines():
163 print(' '+line, file=sys.stderr)
164 print("\nRemainder of file ignored", file=sys.stderr)
165 break
Brett Cannon0096e262004-06-05 01:12:51 +0000166 if reset:
167 known_paths = None
168 return known_paths
169
Christian Heimes8dc226f2008-05-06 23:45:46 +0000170
Brett Cannon12f8c4d2004-07-09 23:38:18 +0000171def addsitedir(sitedir, known_paths=None):
Brett Cannon0096e262004-06-05 01:12:51 +0000172 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
173 'sitedir'"""
174 if known_paths is None:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000175 known_paths = _init_pathinfo()
Brett Cannon0096e262004-06-05 01:12:51 +0000176 reset = 1
177 else:
178 reset = 0
Fred Drake1fb5ce02001-07-02 16:55:42 +0000179 sitedir, sitedircase = makepath(sitedir)
Brett Cannon0096e262004-06-05 01:12:51 +0000180 if not sitedircase in known_paths:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000181 sys.path.append(sitedir) # Add path component
Guido van Rossumf30bec71997-08-29 22:30:45 +0000182 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000183 names = os.listdir(sitedir)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000184 except os.error:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000185 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000186 names = [name for name in names if name.endswith(".pth")]
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 Heimes8dc226f2008-05-06 23:45:46 +0000193
194def check_enableusersite():
195 """Check if user site directory is safe for inclusion
196
Alexandre Vassalottia79e33e2008-05-15 22:51:26 +0000197 The function tests for the command line flag (including environment var),
Christian Heimes8dc226f2008-05-06 23:45: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é4a608c02009-08-20 21:28:05 +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éedacea32010-01-29 11:41:03 +0000228 from sysconfig import get_config_var
229 USER_BASE = get_config_var('userbase')
Tarek Ziadé4a608c02009-08-20 21:28:05 +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éedacea32010-01-29 11:41:03 +0000244 from sysconfig import get_path
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000245
246 if sys.platform == 'darwin':
247 from sysconfig import get_config_var
248 if get_config_var('PYTHONFRAMEWORK'):
249 USER_SITE = get_path('purelib', 'osx_framework_user')
250 return USER_SITE
251
Tarek Ziadéedacea32010-01-29 11:41:03 +0000252 USER_SITE = get_path('purelib', '%s_user' % os.name)
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000253 return USER_SITE
Christian Heimes8dc226f2008-05-06 23:45:46 +0000254
255def addusersitepackages(known_paths):
256 """Add a per user site-package to sys.path
257
258 Each user has its own python directory with site-packages in the
259 home directory.
Christian Heimes8dc226f2008-05-06 23:45:46 +0000260 """
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000261 # get the per user site-package path
262 # this call will also make sure USER_BASE and USER_SITE are set
263 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000264
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000265 if ENABLE_USER_SITE and os.path.isdir(user_site):
266 addsitedir(user_site, known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000267 return known_paths
268
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000269def getsitepackages():
270 """Returns a list containing all global site-packages directories
271 (and possibly site-python).
Christian Heimes8dc226f2008-05-06 23:45:46 +0000272
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000273 For each directory present in the global ``PREFIXES``, this function
274 will find its `site-packages` subdirectory depending on the system
275 environment, and will return a list of full paths.
276 """
277 sitepackages = []
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000278 seen = set()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000279
280 for prefix in PREFIXES:
281 if not prefix or prefix in seen:
282 continue
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000283 seen.add(prefix)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000284
285 if sys.platform in ('os2emx', 'riscos'):
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000286 sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000287 elif os.sep == '/':
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000288 sitepackages.append(os.path.join(prefix, "lib",
Christian Heimes8dc226f2008-05-06 23:45:46 +0000289 "python" + sys.version[:3],
290 "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000291 sitepackages.append(os.path.join(prefix, "lib", "site-python"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000292 else:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000293 sitepackages.append(prefix)
294 sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000295 if sys.platform == "darwin":
296 # for framework builds *only* we add the standard Apple
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000297 # locations.
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000298 from sysconfig import get_config_var
299 framework = get_config_var("PYTHONFRAMEWORK")
Ronald Oussorenbda46722010-08-01 09:02:50 +0000300 if framework:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000301 sitepackages.append(
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000302 os.path.join("/Library", framework,
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000303 sys.version[:3], "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000304 return sitepackages
Christian Heimes8dc226f2008-05-06 23:45:46 +0000305
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000306def addsitepackages(known_paths):
307 """Add site-packages (and possibly site-python) to sys.path"""
308 for sitedir in getsitepackages():
Christian Heimes8dc226f2008-05-06 23:45:46 +0000309 if os.path.isdir(sitedir):
310 addsitedir(sitedir, known_paths)
311
312 return known_paths
Fred Drake7f5296e2001-07-20 20:06:17 +0000313
Brett Cannon0096e262004-06-05 01:12:51 +0000314def setBEGINLIBPATH():
315 """The OS/2 EMX port has optional extension modules that do double duty
316 as DLLs (and must use the .DLL file extension) for other extensions.
317 The library search path needs to be amended so these will be found
318 during module import. Use BEGINLIBPATH so that these are at the start
319 of the library search path.
Tim Peters4e0e1b62004-07-07 20:54:48 +0000320
Brett Cannon0096e262004-06-05 01:12:51 +0000321 """
Andrew MacIntyre2e8a6e02003-12-02 12:27:25 +0000322 dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
323 libpath = os.environ['BEGINLIBPATH'].split(';')
324 if libpath[-1]:
325 libpath.append(dllpath)
326 else:
327 libpath[-1] = dllpath
328 os.environ['BEGINLIBPATH'] = ';'.join(libpath)
329
330
Brett Cannon0096e262004-06-05 01:12:51 +0000331def setquit():
Brian Curtinfb1d3c12010-04-12 23:33:42 +0000332 """Define new builtins 'quit' and 'exit'.
333
334 These are objects which make the interpreter exit when called.
335 The repr of each object contains a hint at how it works.
Guido van Rossumd89fa0c1998-08-07 18:01:14 +0000336
Brett Cannon0096e262004-06-05 01:12:51 +0000337 """
338 if os.sep == ':':
Georg Brandl24cb0532006-03-09 23:22:06 +0000339 eof = 'Cmd-Q'
Brett Cannon0096e262004-06-05 01:12:51 +0000340 elif os.sep == '\\':
Georg Brandl24cb0532006-03-09 23:22:06 +0000341 eof = 'Ctrl-Z plus Return'
Brett Cannon0096e262004-06-05 01:12:51 +0000342 else:
Georg Brandl24cb0532006-03-09 23:22:06 +0000343 eof = 'Ctrl-D (i.e. EOF)'
Tim Peters88ca4672006-03-10 23:39:56 +0000344
Georg Brandl24cb0532006-03-09 23:22:06 +0000345 class Quitter(object):
346 def __init__(self, name):
347 self.name = name
348 def __repr__(self):
349 return 'Use %s() or %s to exit' % (self.name, eof)
350 def __call__(self, code=None):
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000351 # Shells like IDLE catch the SystemExit, but listen when their
352 # stdin wrapper is closed.
353 try:
Christian Heimes862543a2007-12-31 03:07:24 +0000354 fd = -1
355 if hasattr(sys.stdin, "fileno"):
356 fd = sys.stdin.fileno()
357 if fd != 0:
358 # Don't close stdin if it wraps fd 0
359 sys.stdin.close()
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000360 except:
361 pass
Georg Brandl24cb0532006-03-09 23:22:06 +0000362 raise SystemExit(code)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000363 builtins.quit = Quitter('quit')
364 builtins.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:
Victor Stinner4e86d5b2011-05-04 13:55:36 +0200388 fp = open(filename, "r")
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):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000415 print(self.__lines[i])
Guido van Rossumd1252392000-09-05 04:39:55 +0000416 except IndexError:
417 break
418 else:
419 lineno += self.MAXLINES
420 key = None
421 while key is None:
Guido van Rossum704b34d2007-12-20 18:42:56 +0000422 key = input(prompt)
Guido van Rossumd1252392000-09-05 04:39:55 +0000423 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():
Georg Brandl1a3284e2007-12-02 09:40:06 +0000429 """Set 'copyright' and 'credits' in builtins"""
430 builtins.copyright = _Printer("copyright", sys.copyright)
Brett Cannon0096e262004-06-05 01:12:51 +0000431 if sys.platform[:4] == 'java':
Georg Brandl1a3284e2007-12-02 09:40:06 +0000432 builtins.credits = _Printer(
Brett Cannon0096e262004-06-05 01:12:51 +0000433 "credits",
434 "Jython is maintained by the Jython developers (www.jython.org).")
435 else:
Georg Brandl1a3284e2007-12-02 09:40:06 +0000436 builtins.credits = _Printer("credits", """\
Brett Cannon0096e262004-06-05 01:12:51 +0000437 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__)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000440 builtins.license = _Printer(
Brett Cannon0096e262004-06-05 01:12:51 +0000441 "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 Curtinfb1d3c12010-04-12 23:33:42 +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():
Georg Brandl1a3284e2007-12-02 09:40:06 +0000460 builtins.help = _Helper()
Brett Cannon0096e262004-06-05 01:12:51 +0000461
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
Guido van Rossum83213cc2001-06-12 16:48:52 +0000477
Brett Cannon0096e262004-06-05 01:12:51 +0000478def execsitecustomize():
479 """Run custom site specific code, if available."""
480 try:
481 import sitecustomize
482 except ImportError:
483 pass
Guido van Rossumb940e112007-01-10 16:19:56 +0000484 except Exception as err:
Guido van Rossumc6fe9832006-08-19 00:10:28 +0000485 if os.environ.get("PYTHONVERBOSE"):
Victor Stinner52f6dd72010-03-12 14:45:56 +0000486 sys.excepthook(*sys.exc_info())
487 else:
488 sys.stderr.write(
489 "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
490 "%s: %s\n" %
491 (err.__class__.__name__, err))
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000492
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000493
Christian Heimes8dc226f2008-05-06 23:45:46 +0000494def execusercustomize():
495 """Run custom user specific code, if available."""
496 try:
497 import usercustomize
498 except ImportError:
499 pass
Victor Stinner52f6dd72010-03-12 14:45:56 +0000500 except Exception as err:
501 if os.environ.get("PYTHONVERBOSE"):
502 sys.excepthook(*sys.exc_info())
503 else:
504 sys.stderr.write(
505 "Error in usercustomize; set PYTHONVERBOSE for traceback:\n"
506 "%s: %s\n" %
507 (err.__class__.__name__, err))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000508
509
Brett Cannon0096e262004-06-05 01:12:51 +0000510def main():
Éric Araujoc09fca62011-03-23 02:06:24 +0100511 """Add standard site-specific directories to the module search path.
512
513 This function is called automatically when this module is imported,
514 unless the python interpreter was started with the -S flag.
515 """
Christian Heimes8dc226f2008-05-06 23:45:46 +0000516 global ENABLE_USER_SITE
517
Barry Warsaw28a691b2010-04-17 00:19:56 +0000518 abs_paths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000519 known_paths = removeduppaths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000520 if ENABLE_USER_SITE is None:
521 ENABLE_USER_SITE = check_enableusersite()
522 known_paths = addusersitepackages(known_paths)
523 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000524 if sys.platform == 'os2emx':
525 setBEGINLIBPATH()
526 setquit()
527 setcopyright()
528 sethelper()
529 aliasmbcs()
Brett Cannon0096e262004-06-05 01:12:51 +0000530 execsitecustomize()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000531 if ENABLE_USER_SITE:
532 execusercustomize()
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000533
Éric Araujoc09fca62011-03-23 02:06:24 +0100534# Prevent edition of sys.path when python was started with -S and
535# site is imported later.
536if not sys.flags.no_site:
537 main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000538
Christian Heimes8dc226f2008-05-06 23:45:46 +0000539def _script():
540 help = """\
541 %s [--user-base] [--user-site]
542
543 Without arguments print some useful information
544 With arguments print the value of USER_BASE and/or USER_SITE separated
545 by '%s'.
546
547 Exit codes with --user-base or --user-site:
548 0 - user site directory is enabled
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000549 1 - user site directory is disabled by user
Christian Heimes8dc226f2008-05-06 23:45:46 +0000550 2 - uses site directory is disabled by super user
551 or for security reasons
552 >2 - unknown error
553 """
554 args = sys.argv[1:]
555 if not args:
556 print("sys.path = [")
557 for dir in sys.path:
558 print(" %r," % (dir,))
559 print("]")
560 print("USER_BASE: %r (%s)" % (USER_BASE,
561 "exists" if os.path.isdir(USER_BASE) else "doesn't exist"))
562 print("USER_SITE: %r (%s)" % (USER_SITE,
563 "exists" if os.path.isdir(USER_SITE) else "doesn't exist"))
564 print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
565 sys.exit(0)
566
567 buffer = []
568 if '--user-base' in args:
569 buffer.append(USER_BASE)
570 if '--user-site' in args:
571 buffer.append(USER_SITE)
572
573 if buffer:
574 print(os.pathsep.join(buffer))
575 if ENABLE_USER_SITE:
576 sys.exit(0)
577 elif ENABLE_USER_SITE is False:
578 sys.exit(1)
579 elif ENABLE_USER_SITE is None:
580 sys.exit(2)
581 else:
582 sys.exit(3)
583 else:
584 import textwrap
585 print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
586 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000587
588if __name__ == '__main__':
Christian Heimes8dc226f2008-05-06 23:45:46 +0000589 _script()