blob: 96a4bef71efcc007e2bb9fa11166db98e77d87aa [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
Vinay Sajip7ded1f02012-05-26 03:45:29 +010016If a file named "pyvenv.cfg" exists one directory above sys.executable,
17sys.prefix and sys.exec_prefix are set to that directory and
Vinay Sajipabd344c2012-07-03 16:33:57 +010018it is also checked for site-packages and site-python (sys.base_prefix and
19sys.base_exec_prefix will always be the "real" prefixes of the Python
Vinay Sajip7ded1f02012-05-26 03:45:29 +010020installation). If "pyvenv.cfg" (a bootstrap configuration file) contains
21the key "include-system-site-packages" set to anything other than "false"
22(case-insensitive), the system-level prefixes will still also be
23searched for site-packages; otherwise they won't.
24
25All of the resulting site-specific directories, if they exist, are
26appended to sys.path, and also inspected for path configuration
27files.
28
Guido van Rossumf30bec71997-08-29 22:30:45 +000029A path configuration file is a file whose name has the form
30<package>.pth; its contents are additional directories (one per line)
31to be added to sys.path. Non-existing directories (or
32non-directories) are never added to sys.path; no directory is added to
33sys.path more than once. Blank lines and lines beginning with
Guido van Rossumfacf24b2001-12-17 16:07:06 +000034'#' are skipped. Lines starting with 'import' are executed.
Guido van Rossume57c96e1996-08-17 19:56:26 +000035
Guido van Rossumf30bec71997-08-29 22:30:45 +000036For example, suppose sys.prefix and sys.exec_prefix are set to
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000037/usr/local and there is a directory /usr/local/lib/python2.5/site-packages
Guido van Rossum62b297b1997-09-08 02:14:09 +000038with three subdirectories, foo, bar and spam, and two path
39configuration files, foo.pth and bar.pth. Assume foo.pth contains the
40following:
Guido van Rossumf30bec71997-08-29 22:30:45 +000041
42 # foo package configuration
43 foo
44 bar
45 bletch
46
47and bar.pth contains:
48
49 # bar package configuration
50 bar
51
52Then the following directories are added to sys.path, in this order:
53
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000054 /usr/local/lib/python2.5/site-packages/bar
55 /usr/local/lib/python2.5/site-packages/foo
Guido van Rossumf30bec71997-08-29 22:30:45 +000056
57Note that bletch is omitted because it doesn't exist; bar precedes foo
58because bar.pth comes alphabetically before foo.pth; and spam is
59omitted because it is not mentioned in either path configuration file.
Guido van Rossume57c96e1996-08-17 19:56:26 +000060
Antoine Pitrou1a6cb302013-05-04 20:08:35 +020061The readline module is also automatically configured to enable
62completion for systems that support it. This can be overriden in
63sitecustomize, usercustomize or PYTHONSTARTUP.
64
65After these operations, an attempt is made to import a module
Guido van Rossumf30bec71997-08-29 22:30:45 +000066named sitecustomize, which can perform arbitrary additional
67site-specific customizations. If this import fails with an
68ImportError exception, it is silently ignored.
Guido van Rossume57c96e1996-08-17 19:56:26 +000069"""
70
Brett Cannon0096e262004-06-05 01:12:51 +000071import sys
72import os
Vinay Sajip7ded1f02012-05-26 03:45:29 +010073import re
Georg Brandl1a3284e2007-12-02 09:40:06 +000074import builtins
Guido van Rossume57c96e1996-08-17 19:56:26 +000075
Christian Heimes8dc226f2008-05-06 23:45:46 +000076# Prefixes for site-packages; add additional prefixes like /usr/local here
77PREFIXES = [sys.prefix, sys.exec_prefix]
78# Enable per user site-packages directory
79# set it to False to disable the feature or True to force the feature
80ENABLE_USER_SITE = None
Tarek Ziadé4a608c02009-08-20 21:28:05 +000081
Christian Heimes8dc226f2008-05-06 23:45:46 +000082# for distutils.commands.install
Tarek Ziadé4a608c02009-08-20 21:28:05 +000083# These values are initialized by the getuserbase() and getusersitepackages()
84# functions, through the main() function when Python starts.
Christian Heimes8dc226f2008-05-06 23:45:46 +000085USER_SITE = None
86USER_BASE = None
87
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000088
Fred Drake38cb9f12000-09-28 16:52:36 +000089def makepath(*paths):
Victor Stinnerb103a932010-10-12 22:23:23 +000090 dir = os.path.join(*paths)
91 try:
92 dir = os.path.abspath(dir)
93 except OSError:
94 pass
Fred Drake1fb5ce02001-07-02 16:55:42 +000095 return dir, os.path.normcase(dir)
Fred Drake38cb9f12000-09-28 16:52:36 +000096
Christian Heimes8dc226f2008-05-06 23:45:46 +000097
Barry Warsaw28a691b2010-04-17 00:19:56 +000098def abs_paths():
99 """Set all module __file__ and __cached__ attributes to an absolute path"""
Guido van Rossum7ac9d402007-05-18 00:24:43 +0000100 for m in set(sys.modules.values()):
Brett Cannonfd074152012-04-14 14:10:13 -0400101 if (getattr(getattr(m, '__loader__', None), '__module__', None) !=
102 '_frozen_importlib'):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000103 continue # don't mess with a PEP 302-supplied __file__
Brett Cannon0096e262004-06-05 01:12:51 +0000104 try:
105 m.__file__ = os.path.abspath(m.__file__)
Victor Stinnerb103a932010-10-12 22:23:23 +0000106 except (AttributeError, OSError):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000107 pass
108 try:
109 m.__cached__ = os.path.abspath(m.__cached__)
Victor Stinnerb103a932010-10-12 22:23:23 +0000110 except (AttributeError, OSError):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000111 pass
Fred Drake38cb9f12000-09-28 16:52:36 +0000112
Christian Heimes8dc226f2008-05-06 23:45:46 +0000113
Brett Cannon0096e262004-06-05 01:12:51 +0000114def removeduppaths():
115 """ Remove duplicate entries from sys.path along with making them
116 absolute"""
117 # This ensures that the initial path provided by the interpreter contains
118 # only absolute pathnames, even if we're running from the build directory.
119 L = []
120 known_paths = set()
121 for dir in sys.path:
122 # Filter out duplicate paths (on case-insensitive file systems also
123 # if they only differ in case); turn relative paths into absolute
124 # paths.
125 dir, dircase = makepath(dir)
126 if not dircase in known_paths:
127 L.append(dir)
128 known_paths.add(dircase)
129 sys.path[:] = L
130 return known_paths
Fred Drake38cb9f12000-09-28 16:52:36 +0000131
Christian Heimes8dc226f2008-05-06 23:45:46 +0000132
Fred Drake7f5296e2001-07-20 20:06:17 +0000133def _init_pathinfo():
Brett Cannon0096e262004-06-05 01:12:51 +0000134 """Return a set containing all existing directory entries from sys.path"""
135 d = set()
Fred Drake7f5296e2001-07-20 20:06:17 +0000136 for dir in sys.path:
Brett Cannon0096e262004-06-05 01:12:51 +0000137 try:
138 if os.path.isdir(dir):
139 dir, dircase = makepath(dir)
140 d.add(dircase)
141 except TypeError:
Fred Drake7f5296e2001-07-20 20:06:17 +0000142 continue
Brett Cannon0096e262004-06-05 01:12:51 +0000143 return d
Fred Drake7f5296e2001-07-20 20:06:17 +0000144
Christian Heimes8dc226f2008-05-06 23:45:46 +0000145
Brett Cannon0096e262004-06-05 01:12:51 +0000146def addpackage(sitedir, name, known_paths):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000147 """Process a .pth file within the site-packages directory:
148 For each line in the file, either combine it with sitedir to a path
149 and add that to known_paths, or execute it if it starts with 'import '.
150 """
Brett Cannon0096e262004-06-05 01:12:51 +0000151 if known_paths is None:
Brett Cannon13252b82013-01-25 13:57:16 -0500152 known_paths = _init_pathinfo()
Fred Drake7f5296e2001-07-20 20:06:17 +0000153 reset = 1
154 else:
155 reset = 0
Brett Cannon0096e262004-06-05 01:12:51 +0000156 fullname = os.path.join(sitedir, name)
157 try:
Victor Stinner4e86d5b2011-05-04 13:55:36 +0200158 f = open(fullname, "r")
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200159 except OSError:
Brett Cannon0096e262004-06-05 01:12:51 +0000160 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000161 with f:
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000162 for n, line in enumerate(f):
Brett Cannon0096e262004-06-05 01:12:51 +0000163 if line.startswith("#"):
164 continue
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000165 try:
166 if line.startswith(("import ", "import\t")):
167 exec(line)
168 continue
169 line = line.rstrip()
170 dir, dircase = makepath(sitedir, line)
171 if not dircase in known_paths and os.path.exists(dir):
172 sys.path.append(dir)
173 known_paths.add(dircase)
Florent Xicluna54540ec2011-11-04 08:29:17 +0100174 except Exception:
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000175 print("Error processing line {:d} of {}:\n".format(n+1, fullname),
176 file=sys.stderr)
Victor Stinner65532112012-02-21 22:10:16 +0100177 import traceback
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000178 for record in traceback.format_exception(*sys.exc_info()):
179 for line in record.splitlines():
180 print(' '+line, file=sys.stderr)
181 print("\nRemainder of file ignored", file=sys.stderr)
182 break
Brett Cannon0096e262004-06-05 01:12:51 +0000183 if reset:
184 known_paths = None
185 return known_paths
186
Christian Heimes8dc226f2008-05-06 23:45:46 +0000187
Brett Cannon12f8c4d2004-07-09 23:38:18 +0000188def addsitedir(sitedir, known_paths=None):
Brett Cannon0096e262004-06-05 01:12:51 +0000189 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
190 'sitedir'"""
191 if known_paths is None:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000192 known_paths = _init_pathinfo()
Brett Cannon0096e262004-06-05 01:12:51 +0000193 reset = 1
194 else:
195 reset = 0
Fred Drake1fb5ce02001-07-02 16:55:42 +0000196 sitedir, sitedircase = makepath(sitedir)
Brett Cannon0096e262004-06-05 01:12:51 +0000197 if not sitedircase in known_paths:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000198 sys.path.append(sitedir) # Add path component
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100199 known_paths.add(sitedircase)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000200 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000201 names = os.listdir(sitedir)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200202 except OSError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000203 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000204 names = [name for name in names if name.endswith(".pth")]
205 for name in sorted(names):
206 addpackage(sitedir, name, known_paths)
Fred Drake7f5296e2001-07-20 20:06:17 +0000207 if reset:
Brett Cannon0096e262004-06-05 01:12:51 +0000208 known_paths = None
209 return known_paths
Guido van Rossumf30bec71997-08-29 22:30:45 +0000210
Christian Heimes8dc226f2008-05-06 23:45:46 +0000211
212def check_enableusersite():
213 """Check if user site directory is safe for inclusion
214
Alexandre Vassalottia79e33e2008-05-15 22:51:26 +0000215 The function tests for the command line flag (including environment var),
Christian Heimes8dc226f2008-05-06 23:45:46 +0000216 process uid/gid equal to effective uid/gid.
217
218 None: Disabled for security reasons
219 False: Disabled by user (command line option)
220 True: Safe and enabled
221 """
222 if sys.flags.no_user_site:
223 return False
224
225 if hasattr(os, "getuid") and hasattr(os, "geteuid"):
226 # check process uid == effective uid
227 if os.geteuid() != os.getuid():
228 return None
229 if hasattr(os, "getgid") and hasattr(os, "getegid"):
230 # check process gid == effective gid
231 if os.getegid() != os.getgid():
232 return None
233
234 return True
235
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000236def getuserbase():
237 """Returns the `user base` directory path.
238
239 The `user base` directory can be used to store data. If the global
240 variable ``USER_BASE`` is not initialized yet, this function will also set
241 it.
242 """
243 global USER_BASE
244 if USER_BASE is not None:
245 return USER_BASE
Tarek Ziadéedacea32010-01-29 11:41:03 +0000246 from sysconfig import get_config_var
247 USER_BASE = get_config_var('userbase')
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000248 return USER_BASE
249
250def getusersitepackages():
251 """Returns the user-specific site-packages directory path.
252
253 If the global variable ``USER_SITE`` is not initialized yet, this
254 function will also set it.
255 """
256 global USER_SITE
257 user_base = getuserbase() # this will also set USER_BASE
258
259 if USER_SITE is not None:
260 return USER_SITE
261
Tarek Ziadéedacea32010-01-29 11:41:03 +0000262 from sysconfig import get_path
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000263
264 if sys.platform == 'darwin':
265 from sysconfig import get_config_var
266 if get_config_var('PYTHONFRAMEWORK'):
267 USER_SITE = get_path('purelib', 'osx_framework_user')
268 return USER_SITE
269
Tarek Ziadéedacea32010-01-29 11:41:03 +0000270 USER_SITE = get_path('purelib', '%s_user' % os.name)
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000271 return USER_SITE
Christian Heimes8dc226f2008-05-06 23:45:46 +0000272
273def addusersitepackages(known_paths):
274 """Add a per user site-package to sys.path
275
276 Each user has its own python directory with site-packages in the
277 home directory.
Christian Heimes8dc226f2008-05-06 23:45:46 +0000278 """
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000279 # get the per user site-package path
280 # this call will also make sure USER_BASE and USER_SITE are set
281 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000282
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000283 if ENABLE_USER_SITE and os.path.isdir(user_site):
284 addsitedir(user_site, known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000285 return known_paths
286
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100287def getsitepackages(prefixes=None):
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000288 """Returns a list containing all global site-packages directories
289 (and possibly site-python).
Christian Heimes8dc226f2008-05-06 23:45:46 +0000290
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100291 For each directory present in ``prefixes`` (or the global ``PREFIXES``),
292 this function will find its `site-packages` subdirectory depending on the
293 system environment, and will return a list of full paths.
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000294 """
295 sitepackages = []
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000296 seen = set()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000297
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100298 if prefixes is None:
299 prefixes = PREFIXES
300
301 for prefix in prefixes:
Christian Heimes8dc226f2008-05-06 23:45:46 +0000302 if not prefix or prefix in seen:
303 continue
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000304 seen.add(prefix)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000305
Christian Heimesde0b9622012-11-19 00:59:39 +0100306 if os.sep == '/':
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000307 sitepackages.append(os.path.join(prefix, "lib",
Christian Heimes8dc226f2008-05-06 23:45:46 +0000308 "python" + sys.version[:3],
309 "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000310 sitepackages.append(os.path.join(prefix, "lib", "site-python"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000311 else:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000312 sitepackages.append(prefix)
313 sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000314 if sys.platform == "darwin":
315 # for framework builds *only* we add the standard Apple
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000316 # locations.
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000317 from sysconfig import get_config_var
318 framework = get_config_var("PYTHONFRAMEWORK")
Ronald Oussorenbda46722010-08-01 09:02:50 +0000319 if framework:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000320 sitepackages.append(
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000321 os.path.join("/Library", framework,
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000322 sys.version[:3], "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000323 return sitepackages
Christian Heimes8dc226f2008-05-06 23:45:46 +0000324
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100325def addsitepackages(known_paths, prefixes=None):
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000326 """Add site-packages (and possibly site-python) to sys.path"""
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100327 for sitedir in getsitepackages(prefixes):
Christian Heimes8dc226f2008-05-06 23:45:46 +0000328 if os.path.isdir(sitedir):
329 addsitedir(sitedir, known_paths)
330
331 return known_paths
Fred Drake7f5296e2001-07-20 20:06:17 +0000332
Brett Cannon0096e262004-06-05 01:12:51 +0000333def setquit():
Brian Curtinfb1d3c12010-04-12 23:33:42 +0000334 """Define new builtins 'quit' and 'exit'.
335
336 These are objects which make the interpreter exit when called.
337 The repr of each object contains a hint at how it works.
Guido van Rossumd89fa0c1998-08-07 18:01:14 +0000338
Brett Cannon0096e262004-06-05 01:12:51 +0000339 """
340 if os.sep == ':':
Georg Brandl24cb0532006-03-09 23:22:06 +0000341 eof = 'Cmd-Q'
Brett Cannon0096e262004-06-05 01:12:51 +0000342 elif os.sep == '\\':
Georg Brandl24cb0532006-03-09 23:22:06 +0000343 eof = 'Ctrl-Z plus Return'
Brett Cannon0096e262004-06-05 01:12:51 +0000344 else:
Georg Brandl24cb0532006-03-09 23:22:06 +0000345 eof = 'Ctrl-D (i.e. EOF)'
Tim Peters88ca4672006-03-10 23:39:56 +0000346
Georg Brandl24cb0532006-03-09 23:22:06 +0000347 class Quitter(object):
348 def __init__(self, name):
349 self.name = name
350 def __repr__(self):
351 return 'Use %s() or %s to exit' % (self.name, eof)
352 def __call__(self, code=None):
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000353 # Shells like IDLE catch the SystemExit, but listen when their
354 # stdin wrapper is closed.
355 try:
Roger Serwy1eafd102013-04-11 19:16:44 -0500356 sys.stdin.close()
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000357 except:
358 pass
Georg Brandl24cb0532006-03-09 23:22:06 +0000359 raise SystemExit(code)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000360 builtins.quit = Quitter('quit')
361 builtins.exit = Quitter('exit')
Brett Cannon0096e262004-06-05 01:12:51 +0000362
363
364class _Printer(object):
365 """interactive prompt objects for printing the license text, a list of
366 contributors and the copyright notice."""
367
Guido van Rossumd1252392000-09-05 04:39:55 +0000368 MAXLINES = 23
369
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000370 def __init__(self, name, data, files=(), dirs=()):
371 self.__name = name
372 self.__data = data
373 self.__files = files
374 self.__dirs = dirs
375 self.__lines = None
376
377 def __setup(self):
378 if self.__lines:
379 return
380 data = None
381 for dir in self.__dirs:
Brett Cannon0096e262004-06-05 01:12:51 +0000382 for filename in self.__files:
383 filename = os.path.join(dir, filename)
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000384 try:
Giampaolo Rodola'2f50aaf2013-02-12 02:04:27 +0100385 with open(filename, "r") as fp:
386 data = fp.read()
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000387 break
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200388 except OSError:
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000389 pass
390 if data:
391 break
392 if not data:
393 data = self.__data
394 self.__lines = data.split('\n')
Guido van Rossumd1252392000-09-05 04:39:55 +0000395 self.__linecnt = len(self.__lines)
396
397 def __repr__(self):
Guido van Rossumf19a7ac2000-10-03 17:11:37 +0000398 self.__setup()
399 if len(self.__lines) <= self.MAXLINES:
400 return "\n".join(self.__lines)
401 else:
402 return "Type %s() to see the full %s text" % ((self.__name,)*2)
403
404 def __call__(self):
405 self.__setup()
Guido van Rossumd1252392000-09-05 04:39:55 +0000406 prompt = 'Hit Return for more, or q (and Return) to quit: '
407 lineno = 0
408 while 1:
409 try:
410 for i in range(lineno, lineno + self.MAXLINES):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000411 print(self.__lines[i])
Guido van Rossumd1252392000-09-05 04:39:55 +0000412 except IndexError:
413 break
414 else:
415 lineno += self.MAXLINES
416 key = None
417 while key is None:
Guido van Rossum704b34d2007-12-20 18:42:56 +0000418 key = input(prompt)
Guido van Rossumd1252392000-09-05 04:39:55 +0000419 if key not in ('', 'q'):
420 key = None
421 if key == 'q':
422 break
Guido van Rossumd1252392000-09-05 04:39:55 +0000423
Brett Cannon0096e262004-06-05 01:12:51 +0000424def setcopyright():
Georg Brandl1a3284e2007-12-02 09:40:06 +0000425 """Set 'copyright' and 'credits' in builtins"""
426 builtins.copyright = _Printer("copyright", sys.copyright)
Brett Cannon0096e262004-06-05 01:12:51 +0000427 if sys.platform[:4] == 'java':
Georg Brandl1a3284e2007-12-02 09:40:06 +0000428 builtins.credits = _Printer(
Brett Cannon0096e262004-06-05 01:12:51 +0000429 "credits",
430 "Jython is maintained by the Jython developers (www.jython.org).")
431 else:
Georg Brandl1a3284e2007-12-02 09:40:06 +0000432 builtins.credits = _Printer("credits", """\
Brett Cannon0096e262004-06-05 01:12:51 +0000433 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
434 for supporting Python development. See www.python.org for more information.""")
435 here = os.path.dirname(os.__file__)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000436 builtins.license = _Printer(
Brett Cannon0096e262004-06-05 01:12:51 +0000437 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
438 ["LICENSE.txt", "LICENSE"],
439 [os.path.join(here, os.pardir), here, os.curdir])
Guido van Rossumd1252392000-09-05 04:39:55 +0000440
441
Brett Cannon0096e262004-06-05 01:12:51 +0000442class _Helper(object):
Brian Curtinfb1d3c12010-04-12 23:33:42 +0000443 """Define the builtin 'help'.
Brett Cannon0096e262004-06-05 01:12:51 +0000444 This is a wrapper around pydoc.help (with a twist).
Guido van Rossum83213cc2001-06-12 16:48:52 +0000445
Brett Cannon0096e262004-06-05 01:12:51 +0000446 """
447
Guido van Rossum83213cc2001-06-12 16:48:52 +0000448 def __repr__(self):
449 return "Type help() for interactive help, " \
450 "or help(object) for help about object."
451 def __call__(self, *args, **kwds):
452 import pydoc
453 return pydoc.help(*args, **kwds)
454
Brett Cannon0096e262004-06-05 01:12:51 +0000455def sethelper():
Georg Brandl1a3284e2007-12-02 09:40:06 +0000456 builtins.help = _Helper()
Brett Cannon0096e262004-06-05 01:12:51 +0000457
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200458def enablerlcompleter():
459 """Enable default readline configuration on interactive prompts, by
460 registering a sys.__interactivehook__.
461
462 If the readline module can be imported, the hook will set the Tab key
463 as completion key and register ~/.python_history as history file.
464 This can be overriden in the sitecustomize or usercustomize module,
465 or in a PYTHONSTARTUP file.
466 """
467 def register_readline():
468 import atexit
469 try:
470 import readline
471 import rlcompleter
Brett Cannoncd171c82013-07-04 17:43:24 -0400472 except ImportError:
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200473 return
474
475 # Reading the initialization (config) file may not be enough to set a
476 # completion key, so we set one first and then read the file
477 if 'libedit' in getattr(readline, '__doc__', ''):
478 readline.parse_and_bind('bind ^I rl_complete')
479 else:
480 readline.parse_and_bind('tab: complete')
Mark Dickinson9d351332013-05-06 15:39:31 +0200481
482 try:
483 readline.read_init_file()
484 except OSError:
485 # An OSError here could have many causes, but the most likely one
486 # is that there's no .inputrc file (or .editrc file in the case of
487 # Mac OS X + libedit) in the expected location. In that case, we
488 # want to ignore the exception.
489 pass
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200490
491 history = os.path.join(os.path.expanduser('~'), '.python_history')
492 try:
493 readline.read_history_file(history)
494 except IOError:
495 pass
496 atexit.register(readline.write_history_file, history)
497
498 sys.__interactivehook__ = register_readline
499
Brett Cannon0096e262004-06-05 01:12:51 +0000500def aliasmbcs():
501 """On Windows, some default encodings are not provided by Python,
502 while they are always available as "mbcs" in each locale. Make
503 them usable by aliasing to "mbcs" in such a case."""
504 if sys.platform == 'win32':
505 import locale, codecs
506 enc = locale.getdefaultlocale()[1]
507 if enc.startswith('cp'): # "cp***" ?
508 try:
509 codecs.lookup(enc)
510 except LookupError:
511 import encodings
512 encodings._cache[enc] = encodings._unknown
513 encodings.aliases.aliases[enc] = 'mbcs'
514
Guido van Rossum83213cc2001-06-12 16:48:52 +0000515
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100516CONFIG_LINE = re.compile(r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$')
517
518def venv(known_paths):
519 global PREFIXES, ENABLE_USER_SITE
520
521 env = os.environ
Vinay Sajip28952442012-06-25 00:47:46 +0100522 if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env:
523 executable = os.environ['__PYVENV_LAUNCHER__']
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100524 else:
525 executable = sys.executable
Vinay Sajip27e4b602012-11-23 19:16:49 +0000526 exe_dir, _ = os.path.split(os.path.abspath(executable))
527 site_prefix = os.path.dirname(exe_dir)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100528 sys._home = None
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100529 conf_basename = 'pyvenv.cfg'
530 candidate_confs = [
531 conffile for conffile in (
Vinay Sajip27e4b602012-11-23 19:16:49 +0000532 os.path.join(exe_dir, conf_basename),
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100533 os.path.join(site_prefix, conf_basename)
534 )
535 if os.path.isfile(conffile)
536 ]
537
538 if candidate_confs:
539 virtual_conf = candidate_confs[0]
540 system_site = "true"
541 with open(virtual_conf) as f:
542 for line in f:
543 line = line.strip()
544 m = CONFIG_LINE.match(line)
545 if m:
546 d = m.groupdict()
547 key, value = d['key'].lower(), d['value']
548 if key == 'include-system-site-packages':
549 system_site = value.lower()
550 elif key == 'home':
551 sys._home = value
552
553 sys.prefix = sys.exec_prefix = site_prefix
554
555 # Doing this here ensures venv takes precedence over user-site
556 addsitepackages(known_paths, [sys.prefix])
557
558 # addsitepackages will process site_prefix again if its in PREFIXES,
559 # but that's ok; known_paths will prevent anything being added twice
560 if system_site == "true":
561 PREFIXES.insert(0, sys.prefix)
562 else:
563 PREFIXES = [sys.prefix]
564 ENABLE_USER_SITE = False
565
566 return known_paths
567
568
Brett Cannon0096e262004-06-05 01:12:51 +0000569def execsitecustomize():
570 """Run custom site specific code, if available."""
571 try:
572 import sitecustomize
Brett Cannoncd171c82013-07-04 17:43:24 -0400573 except ImportError:
Brett Cannon0096e262004-06-05 01:12:51 +0000574 pass
Guido van Rossumb940e112007-01-10 16:19:56 +0000575 except Exception as err:
Guido van Rossumc6fe9832006-08-19 00:10:28 +0000576 if os.environ.get("PYTHONVERBOSE"):
Victor Stinner52f6dd72010-03-12 14:45:56 +0000577 sys.excepthook(*sys.exc_info())
578 else:
579 sys.stderr.write(
580 "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
581 "%s: %s\n" %
582 (err.__class__.__name__, err))
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000583
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000584
Christian Heimes8dc226f2008-05-06 23:45:46 +0000585def execusercustomize():
586 """Run custom user specific code, if available."""
587 try:
588 import usercustomize
Brett Cannoncd171c82013-07-04 17:43:24 -0400589 except ImportError:
Christian Heimes8dc226f2008-05-06 23:45:46 +0000590 pass
Victor Stinner52f6dd72010-03-12 14:45:56 +0000591 except Exception as err:
592 if os.environ.get("PYTHONVERBOSE"):
593 sys.excepthook(*sys.exc_info())
594 else:
595 sys.stderr.write(
596 "Error in usercustomize; set PYTHONVERBOSE for traceback:\n"
597 "%s: %s\n" %
598 (err.__class__.__name__, err))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000599
600
Brett Cannon0096e262004-06-05 01:12:51 +0000601def main():
Éric Araujoc09fca62011-03-23 02:06:24 +0100602 """Add standard site-specific directories to the module search path.
603
604 This function is called automatically when this module is imported,
605 unless the python interpreter was started with the -S flag.
606 """
Christian Heimes8dc226f2008-05-06 23:45:46 +0000607 global ENABLE_USER_SITE
608
Barry Warsaw28a691b2010-04-17 00:19:56 +0000609 abs_paths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000610 known_paths = removeduppaths()
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100611 known_paths = venv(known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000612 if ENABLE_USER_SITE is None:
613 ENABLE_USER_SITE = check_enableusersite()
614 known_paths = addusersitepackages(known_paths)
615 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000616 setquit()
617 setcopyright()
618 sethelper()
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200619 enablerlcompleter()
Brett Cannon0096e262004-06-05 01:12:51 +0000620 aliasmbcs()
Brett Cannon0096e262004-06-05 01:12:51 +0000621 execsitecustomize()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000622 if ENABLE_USER_SITE:
623 execusercustomize()
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000624
Éric Araujoc09fca62011-03-23 02:06:24 +0100625# Prevent edition of sys.path when python was started with -S and
626# site is imported later.
627if not sys.flags.no_site:
628 main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000629
Christian Heimes8dc226f2008-05-06 23:45:46 +0000630def _script():
631 help = """\
632 %s [--user-base] [--user-site]
633
634 Without arguments print some useful information
635 With arguments print the value of USER_BASE and/or USER_SITE separated
636 by '%s'.
637
638 Exit codes with --user-base or --user-site:
639 0 - user site directory is enabled
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000640 1 - user site directory is disabled by user
Christian Heimes8dc226f2008-05-06 23:45:46 +0000641 2 - uses site directory is disabled by super user
642 or for security reasons
643 >2 - unknown error
644 """
645 args = sys.argv[1:]
646 if not args:
Meador Inge9a7a8112013-04-13 20:29:49 -0500647 user_base = getuserbase()
648 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000649 print("sys.path = [")
650 for dir in sys.path:
651 print(" %r," % (dir,))
652 print("]")
Meador Inge9a7a8112013-04-13 20:29:49 -0500653 print("USER_BASE: %r (%s)" % (user_base,
654 "exists" if os.path.isdir(user_base) else "doesn't exist"))
655 print("USER_SITE: %r (%s)" % (user_site,
656 "exists" if os.path.isdir(user_site) else "doesn't exist"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000657 print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
658 sys.exit(0)
659
660 buffer = []
661 if '--user-base' in args:
662 buffer.append(USER_BASE)
663 if '--user-site' in args:
664 buffer.append(USER_SITE)
665
666 if buffer:
667 print(os.pathsep.join(buffer))
668 if ENABLE_USER_SITE:
669 sys.exit(0)
670 elif ENABLE_USER_SITE is False:
671 sys.exit(1)
672 elif ENABLE_USER_SITE is None:
673 sys.exit(2)
674 else:
675 sys.exit(3)
676 else:
677 import textwrap
678 print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
679 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000680
681if __name__ == '__main__':
Christian Heimes8dc226f2008-05-06 23:45:46 +0000682 _script()