blob: b7d0331fa75afd049182e39637c2f4e1d1b32ab3 [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
Antoine Pitrou9e82b172014-06-12 19:41:30 -040010lib/python<version>/site-packages.
Thomas Wouters0e3f5912006-08-11 14:57:12 +000011On 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
Antoine Pitrou9e82b172014-06-12 19:41:30 -040018it is also checked for site-packages (sys.base_prefix and
Vinay Sajipabd344c2012-07-03 16:33:57 +010019sys.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
Georg Brandl1a3284e2007-12-02 09:40:06 +000073import builtins
Antoine Pitrou853395b2013-08-06 22:56:40 +020074import _sitebuiltins
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()):
Eric Snow32439d62015-05-02 19:15:18 -0600101 if (getattr(getattr(m, '__loader__', None), '__module__', None) not in
102 ('_frozen_importlib', '_frozen_importlib_external')):
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):
Antoine Pitrou9e82b172014-06-12 19:41:30 -0400288 """Returns a list containing all global site-packages directories.
Christian Heimes8dc226f2008-05-06 23:45:46 +0000289
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100290 For each directory present in ``prefixes`` (or the global ``PREFIXES``),
291 this function will find its `site-packages` subdirectory depending on the
292 system environment, and will return a list of full paths.
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000293 """
294 sitepackages = []
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000295 seen = set()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000296
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100297 if prefixes is None:
298 prefixes = PREFIXES
299
300 for prefix in prefixes:
Christian Heimes8dc226f2008-05-06 23:45:46 +0000301 if not prefix or prefix in seen:
302 continue
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000303 seen.add(prefix)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000304
Christian Heimesde0b9622012-11-19 00:59:39 +0100305 if os.sep == '/':
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000306 sitepackages.append(os.path.join(prefix, "lib",
Christian Heimes8dc226f2008-05-06 23:45:46 +0000307 "python" + sys.version[:3],
308 "site-packages"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000309 else:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000310 sitepackages.append(prefix)
311 sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000312 if sys.platform == "darwin":
313 # for framework builds *only* we add the standard Apple
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000314 # locations.
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000315 from sysconfig import get_config_var
316 framework = get_config_var("PYTHONFRAMEWORK")
Ronald Oussorenbda46722010-08-01 09:02:50 +0000317 if framework:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000318 sitepackages.append(
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000319 os.path.join("/Library", framework,
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000320 sys.version[:3], "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000321 return sitepackages
Christian Heimes8dc226f2008-05-06 23:45:46 +0000322
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100323def addsitepackages(known_paths, prefixes=None):
Antoine Pitrou9e82b172014-06-12 19:41:30 -0400324 """Add site-packages to sys.path"""
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100325 for sitedir in getsitepackages(prefixes):
Christian Heimes8dc226f2008-05-06 23:45:46 +0000326 if os.path.isdir(sitedir):
327 addsitedir(sitedir, known_paths)
328
329 return known_paths
Fred Drake7f5296e2001-07-20 20:06:17 +0000330
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
Antoine Pitrou853395b2013-08-06 22:56:40 +0200345 builtins.quit = _sitebuiltins.Quitter('quit', eof)
346 builtins.exit = _sitebuiltins.Quitter('exit', eof)
Brett Cannon0096e262004-06-05 01:12:51 +0000347
348
Brett Cannon0096e262004-06-05 01:12:51 +0000349def setcopyright():
Georg Brandl1a3284e2007-12-02 09:40:06 +0000350 """Set 'copyright' and 'credits' in builtins"""
Antoine Pitrou853395b2013-08-06 22:56:40 +0200351 builtins.copyright = _sitebuiltins._Printer("copyright", sys.copyright)
Brett Cannon0096e262004-06-05 01:12:51 +0000352 if sys.platform[:4] == 'java':
Antoine Pitrou853395b2013-08-06 22:56:40 +0200353 builtins.credits = _sitebuiltins._Printer(
Brett Cannon0096e262004-06-05 01:12:51 +0000354 "credits",
Antoine Pitrouf93c7b82013-08-01 19:46:04 +0200355 "Jython is maintained by the Jython developers (www.jython.org).")
Brett Cannon0096e262004-06-05 01:12:51 +0000356 else:
Antoine Pitrou853395b2013-08-06 22:56:40 +0200357 builtins.credits = _sitebuiltins._Printer("credits", """\
Brett Cannon0096e262004-06-05 01:12:51 +0000358 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
Antoine Pitrouf93c7b82013-08-01 19:46:04 +0200359 for supporting Python development. See www.python.org for more information.""")
Martin v. Löwisc00d39e2014-03-30 21:07:25 +0200360 files, dirs = [], []
361 # Not all modules are required to have a __file__ attribute. See
362 # PEP 420 for more details.
363 if hasattr(os, '__file__'):
364 here = os.path.dirname(os.__file__)
365 files.extend(["LICENSE.txt", "LICENSE"])
366 dirs.extend([os.path.join(here, os.pardir), here, os.curdir])
Antoine Pitrou853395b2013-08-06 22:56:40 +0200367 builtins.license = _sitebuiltins._Printer(
R David Murray692ee9e2013-09-14 13:31:44 -0400368 "license",
Benjamin Petersond40f1362015-02-01 20:17:22 -0500369 "See https://www.python.org/psf/license/",
Martin v. Löwisc00d39e2014-03-30 21:07:25 +0200370 files, dirs)
Guido van Rossumd1252392000-09-05 04:39:55 +0000371
372
Brett Cannon0096e262004-06-05 01:12:51 +0000373def sethelper():
Antoine Pitrou853395b2013-08-06 22:56:40 +0200374 builtins.help = _sitebuiltins._Helper()
Brett Cannon0096e262004-06-05 01:12:51 +0000375
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200376def enablerlcompleter():
377 """Enable default readline configuration on interactive prompts, by
378 registering a sys.__interactivehook__.
379
380 If the readline module can be imported, the hook will set the Tab key
381 as completion key and register ~/.python_history as history file.
382 This can be overriden in the sitecustomize or usercustomize module,
383 or in a PYTHONSTARTUP file.
384 """
385 def register_readline():
386 import atexit
387 try:
388 import readline
389 import rlcompleter
Brett Cannoncd171c82013-07-04 17:43:24 -0400390 except ImportError:
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200391 return
392
393 # Reading the initialization (config) file may not be enough to set a
R David Murray4a043012013-09-06 13:08:08 -0400394 # completion key, so we set one first and then read the file.
395 readline_doc = getattr(readline, '__doc__', '')
396 if readline_doc is not None and 'libedit' in readline_doc:
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200397 readline.parse_and_bind('bind ^I rl_complete')
398 else:
399 readline.parse_and_bind('tab: complete')
Mark Dickinson9d351332013-05-06 15:39:31 +0200400
401 try:
402 readline.read_init_file()
403 except OSError:
404 # An OSError here could have many causes, but the most likely one
405 # is that there's no .inputrc file (or .editrc file in the case of
406 # Mac OS X + libedit) in the expected location. In that case, we
407 # want to ignore the exception.
408 pass
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200409
Jason R. Coombs4d914902014-01-28 09:06:58 -0500410 if readline.get_current_history_length() == 0:
Antoine Pitrou5d23e6d2013-09-29 22:18:38 +0200411 # If no history was loaded, default to .python_history.
412 # The guard is necessary to avoid doubling history size at
413 # each interpreter exit when readline was already configured
414 # through a PYTHONSTARTUP hook, see:
415 # http://bugs.python.org/issue5845#msg198636
416 history = os.path.join(os.path.expanduser('~'),
417 '.python_history')
418 try:
419 readline.read_history_file(history)
420 except IOError:
421 pass
422 atexit.register(readline.write_history_file, history)
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200423
424 sys.__interactivehook__ = register_readline
425
Brett Cannon0096e262004-06-05 01:12:51 +0000426def aliasmbcs():
427 """On Windows, some default encodings are not provided by Python,
428 while they are always available as "mbcs" in each locale. Make
429 them usable by aliasing to "mbcs" in such a case."""
430 if sys.platform == 'win32':
Antoine Pitroufd4722c2013-10-12 00:13:50 +0200431 import _bootlocale, codecs
432 enc = _bootlocale.getpreferredencoding(False)
Brett Cannon0096e262004-06-05 01:12:51 +0000433 if enc.startswith('cp'): # "cp***" ?
434 try:
435 codecs.lookup(enc)
436 except LookupError:
437 import encodings
438 encodings._cache[enc] = encodings._unknown
439 encodings.aliases.aliases[enc] = 'mbcs'
440
Christian Heimes8c9cd5a2013-10-12 00:24:55 +0200441CONFIG_LINE = r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$'
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100442
443def venv(known_paths):
444 global PREFIXES, ENABLE_USER_SITE
445
446 env = os.environ
Vinay Sajip28952442012-06-25 00:47:46 +0100447 if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env:
448 executable = os.environ['__PYVENV_LAUNCHER__']
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100449 else:
450 executable = sys.executable
Vinay Sajip27e4b602012-11-23 19:16:49 +0000451 exe_dir, _ = os.path.split(os.path.abspath(executable))
452 site_prefix = os.path.dirname(exe_dir)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100453 sys._home = None
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100454 conf_basename = 'pyvenv.cfg'
455 candidate_confs = [
456 conffile for conffile in (
Vinay Sajip27e4b602012-11-23 19:16:49 +0000457 os.path.join(exe_dir, conf_basename),
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100458 os.path.join(site_prefix, conf_basename)
459 )
460 if os.path.isfile(conffile)
461 ]
462
463 if candidate_confs:
Christian Heimes8c9cd5a2013-10-12 00:24:55 +0200464 import re
465 config_line = re.compile(CONFIG_LINE)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100466 virtual_conf = candidate_confs[0]
467 system_site = "true"
468 with open(virtual_conf) as f:
469 for line in f:
470 line = line.strip()
Christian Heimesbfc3a9a2013-10-12 00:28:17 +0200471 m = config_line.match(line)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100472 if m:
473 d = m.groupdict()
474 key, value = d['key'].lower(), d['value']
475 if key == 'include-system-site-packages':
476 system_site = value.lower()
477 elif key == 'home':
478 sys._home = value
479
480 sys.prefix = sys.exec_prefix = site_prefix
481
482 # Doing this here ensures venv takes precedence over user-site
483 addsitepackages(known_paths, [sys.prefix])
484
485 # addsitepackages will process site_prefix again if its in PREFIXES,
486 # but that's ok; known_paths will prevent anything being added twice
487 if system_site == "true":
488 PREFIXES.insert(0, sys.prefix)
489 else:
490 PREFIXES = [sys.prefix]
491 ENABLE_USER_SITE = False
492
493 return known_paths
494
495
Brett Cannon0096e262004-06-05 01:12:51 +0000496def execsitecustomize():
497 """Run custom site specific code, if available."""
498 try:
499 import sitecustomize
Brett Cannoncd171c82013-07-04 17:43:24 -0400500 except ImportError:
Brett Cannon0096e262004-06-05 01:12:51 +0000501 pass
Guido van Rossumb940e112007-01-10 16:19:56 +0000502 except Exception as err:
Guido van Rossumc6fe9832006-08-19 00:10:28 +0000503 if os.environ.get("PYTHONVERBOSE"):
Victor Stinner52f6dd72010-03-12 14:45:56 +0000504 sys.excepthook(*sys.exc_info())
505 else:
506 sys.stderr.write(
507 "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
508 "%s: %s\n" %
509 (err.__class__.__name__, err))
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000510
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000511
Christian Heimes8dc226f2008-05-06 23:45:46 +0000512def execusercustomize():
513 """Run custom user specific code, if available."""
514 try:
515 import usercustomize
Brett Cannoncd171c82013-07-04 17:43:24 -0400516 except ImportError:
Christian Heimes8dc226f2008-05-06 23:45:46 +0000517 pass
Victor Stinner52f6dd72010-03-12 14:45:56 +0000518 except Exception as err:
519 if os.environ.get("PYTHONVERBOSE"):
520 sys.excepthook(*sys.exc_info())
521 else:
522 sys.stderr.write(
523 "Error in usercustomize; set PYTHONVERBOSE for traceback:\n"
524 "%s: %s\n" %
525 (err.__class__.__name__, err))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000526
527
Brett Cannon0096e262004-06-05 01:12:51 +0000528def main():
Éric Araujoc09fca62011-03-23 02:06:24 +0100529 """Add standard site-specific directories to the module search path.
530
531 This function is called automatically when this module is imported,
532 unless the python interpreter was started with the -S flag.
533 """
Christian Heimes8dc226f2008-05-06 23:45:46 +0000534 global ENABLE_USER_SITE
535
Barry Warsaw28a691b2010-04-17 00:19:56 +0000536 abs_paths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000537 known_paths = removeduppaths()
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100538 known_paths = venv(known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000539 if ENABLE_USER_SITE is None:
540 ENABLE_USER_SITE = check_enableusersite()
541 known_paths = addusersitepackages(known_paths)
542 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000543 setquit()
544 setcopyright()
545 sethelper()
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200546 enablerlcompleter()
Brett Cannon0096e262004-06-05 01:12:51 +0000547 aliasmbcs()
Brett Cannon0096e262004-06-05 01:12:51 +0000548 execsitecustomize()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000549 if ENABLE_USER_SITE:
550 execusercustomize()
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000551
Éric Araujoc09fca62011-03-23 02:06:24 +0100552# Prevent edition of sys.path when python was started with -S and
553# site is imported later.
554if not sys.flags.no_site:
555 main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000556
Christian Heimes8dc226f2008-05-06 23:45:46 +0000557def _script():
558 help = """\
559 %s [--user-base] [--user-site]
560
561 Without arguments print some useful information
562 With arguments print the value of USER_BASE and/or USER_SITE separated
563 by '%s'.
564
565 Exit codes with --user-base or --user-site:
566 0 - user site directory is enabled
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000567 1 - user site directory is disabled by user
Christian Heimes8dc226f2008-05-06 23:45:46 +0000568 2 - uses site directory is disabled by super user
569 or for security reasons
570 >2 - unknown error
571 """
572 args = sys.argv[1:]
573 if not args:
Meador Inge9a7a8112013-04-13 20:29:49 -0500574 user_base = getuserbase()
575 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000576 print("sys.path = [")
577 for dir in sys.path:
578 print(" %r," % (dir,))
579 print("]")
Meador Inge9a7a8112013-04-13 20:29:49 -0500580 print("USER_BASE: %r (%s)" % (user_base,
581 "exists" if os.path.isdir(user_base) else "doesn't exist"))
582 print("USER_SITE: %r (%s)" % (user_site,
583 "exists" if os.path.isdir(user_site) else "doesn't exist"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000584 print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
585 sys.exit(0)
586
587 buffer = []
588 if '--user-base' in args:
589 buffer.append(USER_BASE)
590 if '--user-site' in args:
591 buffer.append(USER_SITE)
592
593 if buffer:
594 print(os.pathsep.join(buffer))
595 if ENABLE_USER_SITE:
596 sys.exit(0)
597 elif ENABLE_USER_SITE is False:
598 sys.exit(1)
599 elif ENABLE_USER_SITE is None:
600 sys.exit(2)
601 else:
602 sys.exit(3)
603 else:
604 import textwrap
605 print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
606 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000607
608if __name__ == '__main__':
Christian Heimes8dc226f2008-05-06 23:45:46 +0000609 _script()