blob: a2c0becbc1e935a15dcaf4e1921d6ce1d82d149f [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
R. David Murrayb4ca59b2010-12-26 19:54:29 +000058import traceback
Guido van Rossume57c96e1996-08-17 19:56:26 +000059
Christian Heimes8dc226f2008-05-06 23:45:46 +000060# Prefixes for site-packages; add additional prefixes like /usr/local here
61PREFIXES = [sys.prefix, sys.exec_prefix]
62# Enable per user site-packages directory
63# set it to False to disable the feature or True to force the feature
64ENABLE_USER_SITE = None
Tarek Ziadé4a608c02009-08-20 21:28:05 +000065
Christian Heimes8dc226f2008-05-06 23:45:46 +000066# for distutils.commands.install
Tarek Ziadé4a608c02009-08-20 21:28:05 +000067# These values are initialized by the getuserbase() and getusersitepackages()
68# functions, through the main() function when Python starts.
Christian Heimes8dc226f2008-05-06 23:45:46 +000069USER_SITE = None
70USER_BASE = None
71
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000072
Fred Drake38cb9f12000-09-28 16:52:36 +000073def makepath(*paths):
Victor Stinnerb103a932010-10-12 22:23:23 +000074 dir = os.path.join(*paths)
75 try:
76 dir = os.path.abspath(dir)
77 except OSError:
78 pass
Fred Drake1fb5ce02001-07-02 16:55:42 +000079 return dir, os.path.normcase(dir)
Fred Drake38cb9f12000-09-28 16:52:36 +000080
Christian Heimes8dc226f2008-05-06 23:45:46 +000081
Barry Warsaw28a691b2010-04-17 00:19:56 +000082def abs_paths():
83 """Set all module __file__ and __cached__ attributes to an absolute path"""
Guido van Rossum7ac9d402007-05-18 00:24:43 +000084 for m in set(sys.modules.values()):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000085 if hasattr(m, '__loader__'):
86 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:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000141 f = open(fullname, "rU")
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)
157 except Exception as err:
158 print("Error processing line {:d} of {}:\n".format(n+1, fullname),
159 file=sys.stderr)
160 for record in traceback.format_exception(*sys.exc_info()):
161 for line in record.splitlines():
162 print(' '+line, file=sys.stderr)
163 print("\nRemainder of file ignored", file=sys.stderr)
164 break
Brett Cannon0096e262004-06-05 01:12:51 +0000165 if reset:
166 known_paths = None
167 return known_paths
168
Christian Heimes8dc226f2008-05-06 23:45:46 +0000169
Brett Cannon12f8c4d2004-07-09 23:38:18 +0000170def addsitedir(sitedir, known_paths=None):
Brett Cannon0096e262004-06-05 01:12:51 +0000171 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
172 'sitedir'"""
173 if known_paths is None:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000174 known_paths = _init_pathinfo()
Brett Cannon0096e262004-06-05 01:12:51 +0000175 reset = 1
176 else:
177 reset = 0
Fred Drake1fb5ce02001-07-02 16:55:42 +0000178 sitedir, sitedircase = makepath(sitedir)
Brett Cannon0096e262004-06-05 01:12:51 +0000179 if not sitedircase in known_paths:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000180 sys.path.append(sitedir) # Add path component
Guido van Rossumf30bec71997-08-29 22:30:45 +0000181 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000182 names = os.listdir(sitedir)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000183 except os.error:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000184 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000185 names = [name for name in names if name.endswith(".pth")]
186 for name in sorted(names):
187 addpackage(sitedir, name, known_paths)
Fred Drake7f5296e2001-07-20 20:06:17 +0000188 if reset:
Brett Cannon0096e262004-06-05 01:12:51 +0000189 known_paths = None
190 return known_paths
Guido van Rossumf30bec71997-08-29 22:30:45 +0000191
Christian Heimes8dc226f2008-05-06 23:45:46 +0000192
193def check_enableusersite():
194 """Check if user site directory is safe for inclusion
195
Alexandre Vassalottia79e33e2008-05-15 22:51:26 +0000196 The function tests for the command line flag (including environment var),
Christian Heimes8dc226f2008-05-06 23:45:46 +0000197 process uid/gid equal to effective uid/gid.
198
199 None: Disabled for security reasons
200 False: Disabled by user (command line option)
201 True: Safe and enabled
202 """
203 if sys.flags.no_user_site:
204 return False
205
206 if hasattr(os, "getuid") and hasattr(os, "geteuid"):
207 # check process uid == effective uid
208 if os.geteuid() != os.getuid():
209 return None
210 if hasattr(os, "getgid") and hasattr(os, "getegid"):
211 # check process gid == effective gid
212 if os.getegid() != os.getgid():
213 return None
214
215 return True
216
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000217def getuserbase():
218 """Returns the `user base` directory path.
219
220 The `user base` directory can be used to store data. If the global
221 variable ``USER_BASE`` is not initialized yet, this function will also set
222 it.
223 """
224 global USER_BASE
225 if USER_BASE is not None:
226 return USER_BASE
Tarek Ziadéedacea32010-01-29 11:41:03 +0000227 from sysconfig import get_config_var
228 USER_BASE = get_config_var('userbase')
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000229 return USER_BASE
230
231def getusersitepackages():
232 """Returns the user-specific site-packages directory path.
233
234 If the global variable ``USER_SITE`` is not initialized yet, this
235 function will also set it.
236 """
237 global USER_SITE
238 user_base = getuserbase() # this will also set USER_BASE
239
240 if USER_SITE is not None:
241 return USER_SITE
242
Tarek Ziadéedacea32010-01-29 11:41:03 +0000243 from sysconfig import get_path
244 import os
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:
Alex Martelli01c77c62006-08-24 02:58:11 +0000388 fp = open(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):
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():
Christian Heimes8dc226f2008-05-06 23:45:46 +0000511 global ENABLE_USER_SITE
512
Barry Warsaw28a691b2010-04-17 00:19:56 +0000513 abs_paths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000514 known_paths = removeduppaths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000515 if ENABLE_USER_SITE is None:
516 ENABLE_USER_SITE = check_enableusersite()
517 known_paths = addusersitepackages(known_paths)
518 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000519 if sys.platform == 'os2emx':
520 setBEGINLIBPATH()
521 setquit()
522 setcopyright()
523 sethelper()
524 aliasmbcs()
Brett Cannon0096e262004-06-05 01:12:51 +0000525 execsitecustomize()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000526 if ENABLE_USER_SITE:
527 execusercustomize()
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000528
Brett Cannon0096e262004-06-05 01:12:51 +0000529main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000530
Christian Heimes8dc226f2008-05-06 23:45:46 +0000531def _script():
532 help = """\
533 %s [--user-base] [--user-site]
534
535 Without arguments print some useful information
536 With arguments print the value of USER_BASE and/or USER_SITE separated
537 by '%s'.
538
539 Exit codes with --user-base or --user-site:
540 0 - user site directory is enabled
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000541 1 - user site directory is disabled by user
Christian Heimes8dc226f2008-05-06 23:45:46 +0000542 2 - uses site directory is disabled by super user
543 or for security reasons
544 >2 - unknown error
545 """
546 args = sys.argv[1:]
547 if not args:
548 print("sys.path = [")
549 for dir in sys.path:
550 print(" %r," % (dir,))
551 print("]")
552 print("USER_BASE: %r (%s)" % (USER_BASE,
553 "exists" if os.path.isdir(USER_BASE) else "doesn't exist"))
554 print("USER_SITE: %r (%s)" % (USER_SITE,
555 "exists" if os.path.isdir(USER_SITE) else "doesn't exist"))
556 print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
557 sys.exit(0)
558
559 buffer = []
560 if '--user-base' in args:
561 buffer.append(USER_BASE)
562 if '--user-site' in args:
563 buffer.append(USER_SITE)
564
565 if buffer:
566 print(os.pathsep.join(buffer))
567 if ENABLE_USER_SITE:
568 sys.exit(0)
569 elif ENABLE_USER_SITE is False:
570 sys.exit(1)
571 elif ENABLE_USER_SITE is None:
572 sys.exit(2)
573 else:
574 sys.exit(3)
575 else:
576 import textwrap
577 print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
578 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000579
580if __name__ == '__main__':
Christian Heimes8dc226f2008-05-06 23:45:46 +0000581 _script()