blob: e1fa30eacdf626184a358fdf2788bfa10233e5b4 [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
Antoine Pitrou853395b2013-08-06 22:56:40 +020075import _sitebuiltins
Guido van Rossume57c96e1996-08-17 19:56:26 +000076
Christian Heimes8dc226f2008-05-06 23:45:46 +000077# Prefixes for site-packages; add additional prefixes like /usr/local here
78PREFIXES = [sys.prefix, sys.exec_prefix]
79# Enable per user site-packages directory
80# set it to False to disable the feature or True to force the feature
81ENABLE_USER_SITE = None
Tarek Ziadé4a608c02009-08-20 21:28:05 +000082
Christian Heimes8dc226f2008-05-06 23:45:46 +000083# for distutils.commands.install
Tarek Ziadé4a608c02009-08-20 21:28:05 +000084# These values are initialized by the getuserbase() and getusersitepackages()
85# functions, through the main() function when Python starts.
Christian Heimes8dc226f2008-05-06 23:45:46 +000086USER_SITE = None
87USER_BASE = None
88
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000089
Fred Drake38cb9f12000-09-28 16:52:36 +000090def makepath(*paths):
Victor Stinnerb103a932010-10-12 22:23:23 +000091 dir = os.path.join(*paths)
92 try:
93 dir = os.path.abspath(dir)
94 except OSError:
95 pass
Fred Drake1fb5ce02001-07-02 16:55:42 +000096 return dir, os.path.normcase(dir)
Fred Drake38cb9f12000-09-28 16:52:36 +000097
Christian Heimes8dc226f2008-05-06 23:45:46 +000098
Barry Warsaw28a691b2010-04-17 00:19:56 +000099def abs_paths():
100 """Set all module __file__ and __cached__ attributes to an absolute path"""
Guido van Rossum7ac9d402007-05-18 00:24:43 +0000101 for m in set(sys.modules.values()):
Brett Cannonfd074152012-04-14 14:10:13 -0400102 if (getattr(getattr(m, '__loader__', None), '__module__', None) !=
103 '_frozen_importlib'):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000104 continue # don't mess with a PEP 302-supplied __file__
Brett Cannon0096e262004-06-05 01:12:51 +0000105 try:
106 m.__file__ = os.path.abspath(m.__file__)
Victor Stinnerb103a932010-10-12 22:23:23 +0000107 except (AttributeError, OSError):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000108 pass
109 try:
110 m.__cached__ = os.path.abspath(m.__cached__)
Victor Stinnerb103a932010-10-12 22:23:23 +0000111 except (AttributeError, OSError):
Barry Warsaw28a691b2010-04-17 00:19:56 +0000112 pass
Fred Drake38cb9f12000-09-28 16:52:36 +0000113
Christian Heimes8dc226f2008-05-06 23:45:46 +0000114
Brett Cannon0096e262004-06-05 01:12:51 +0000115def removeduppaths():
116 """ Remove duplicate entries from sys.path along with making them
117 absolute"""
118 # This ensures that the initial path provided by the interpreter contains
119 # only absolute pathnames, even if we're running from the build directory.
120 L = []
121 known_paths = set()
122 for dir in sys.path:
123 # Filter out duplicate paths (on case-insensitive file systems also
124 # if they only differ in case); turn relative paths into absolute
125 # paths.
126 dir, dircase = makepath(dir)
127 if not dircase in known_paths:
128 L.append(dir)
129 known_paths.add(dircase)
130 sys.path[:] = L
131 return known_paths
Fred Drake38cb9f12000-09-28 16:52:36 +0000132
Christian Heimes8dc226f2008-05-06 23:45:46 +0000133
Fred Drake7f5296e2001-07-20 20:06:17 +0000134def _init_pathinfo():
Brett Cannon0096e262004-06-05 01:12:51 +0000135 """Return a set containing all existing directory entries from sys.path"""
136 d = set()
Fred Drake7f5296e2001-07-20 20:06:17 +0000137 for dir in sys.path:
Brett Cannon0096e262004-06-05 01:12:51 +0000138 try:
139 if os.path.isdir(dir):
140 dir, dircase = makepath(dir)
141 d.add(dircase)
142 except TypeError:
Fred Drake7f5296e2001-07-20 20:06:17 +0000143 continue
Brett Cannon0096e262004-06-05 01:12:51 +0000144 return d
Fred Drake7f5296e2001-07-20 20:06:17 +0000145
Christian Heimes8dc226f2008-05-06 23:45:46 +0000146
Brett Cannon0096e262004-06-05 01:12:51 +0000147def addpackage(sitedir, name, known_paths):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000148 """Process a .pth file within the site-packages directory:
149 For each line in the file, either combine it with sitedir to a path
150 and add that to known_paths, or execute it if it starts with 'import '.
151 """
Brett Cannon0096e262004-06-05 01:12:51 +0000152 if known_paths is None:
Brett Cannon13252b82013-01-25 13:57:16 -0500153 known_paths = _init_pathinfo()
Fred Drake7f5296e2001-07-20 20:06:17 +0000154 reset = 1
155 else:
156 reset = 0
Brett Cannon0096e262004-06-05 01:12:51 +0000157 fullname = os.path.join(sitedir, name)
158 try:
Victor Stinner4e86d5b2011-05-04 13:55:36 +0200159 f = open(fullname, "r")
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200160 except OSError:
Brett Cannon0096e262004-06-05 01:12:51 +0000161 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000162 with f:
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000163 for n, line in enumerate(f):
Brett Cannon0096e262004-06-05 01:12:51 +0000164 if line.startswith("#"):
165 continue
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000166 try:
167 if line.startswith(("import ", "import\t")):
168 exec(line)
169 continue
170 line = line.rstrip()
171 dir, dircase = makepath(sitedir, line)
172 if not dircase in known_paths and os.path.exists(dir):
173 sys.path.append(dir)
174 known_paths.add(dircase)
Florent Xicluna54540ec2011-11-04 08:29:17 +0100175 except Exception:
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000176 print("Error processing line {:d} of {}:\n".format(n+1, fullname),
177 file=sys.stderr)
Victor Stinner65532112012-02-21 22:10:16 +0100178 import traceback
R. David Murrayb4ca59b2010-12-26 19:54:29 +0000179 for record in traceback.format_exception(*sys.exc_info()):
180 for line in record.splitlines():
181 print(' '+line, file=sys.stderr)
182 print("\nRemainder of file ignored", file=sys.stderr)
183 break
Brett Cannon0096e262004-06-05 01:12:51 +0000184 if reset:
185 known_paths = None
186 return known_paths
187
Christian Heimes8dc226f2008-05-06 23:45:46 +0000188
Brett Cannon12f8c4d2004-07-09 23:38:18 +0000189def addsitedir(sitedir, known_paths=None):
Brett Cannon0096e262004-06-05 01:12:51 +0000190 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
191 'sitedir'"""
192 if known_paths is None:
Brett Cannon4d0bddf2004-07-20 02:28:28 +0000193 known_paths = _init_pathinfo()
Brett Cannon0096e262004-06-05 01:12:51 +0000194 reset = 1
195 else:
196 reset = 0
Fred Drake1fb5ce02001-07-02 16:55:42 +0000197 sitedir, sitedircase = makepath(sitedir)
Brett Cannon0096e262004-06-05 01:12:51 +0000198 if not sitedircase in known_paths:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000199 sys.path.append(sitedir) # Add path component
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100200 known_paths.add(sitedircase)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000201 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000202 names = os.listdir(sitedir)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200203 except OSError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000204 return
Christian Heimes8dc226f2008-05-06 23:45:46 +0000205 names = [name for name in names if name.endswith(".pth")]
206 for name in sorted(names):
207 addpackage(sitedir, name, known_paths)
Fred Drake7f5296e2001-07-20 20:06:17 +0000208 if reset:
Brett Cannon0096e262004-06-05 01:12:51 +0000209 known_paths = None
210 return known_paths
Guido van Rossumf30bec71997-08-29 22:30:45 +0000211
Christian Heimes8dc226f2008-05-06 23:45:46 +0000212
213def check_enableusersite():
214 """Check if user site directory is safe for inclusion
215
Alexandre Vassalottia79e33e2008-05-15 22:51:26 +0000216 The function tests for the command line flag (including environment var),
Christian Heimes8dc226f2008-05-06 23:45:46 +0000217 process uid/gid equal to effective uid/gid.
218
219 None: Disabled for security reasons
220 False: Disabled by user (command line option)
221 True: Safe and enabled
222 """
223 if sys.flags.no_user_site:
224 return False
225
226 if hasattr(os, "getuid") and hasattr(os, "geteuid"):
227 # check process uid == effective uid
228 if os.geteuid() != os.getuid():
229 return None
230 if hasattr(os, "getgid") and hasattr(os, "getegid"):
231 # check process gid == effective gid
232 if os.getegid() != os.getgid():
233 return None
234
235 return True
236
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000237def getuserbase():
238 """Returns the `user base` directory path.
239
240 The `user base` directory can be used to store data. If the global
241 variable ``USER_BASE`` is not initialized yet, this function will also set
242 it.
243 """
244 global USER_BASE
245 if USER_BASE is not None:
246 return USER_BASE
Tarek Ziadéedacea32010-01-29 11:41:03 +0000247 from sysconfig import get_config_var
248 USER_BASE = get_config_var('userbase')
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000249 return USER_BASE
250
251def getusersitepackages():
252 """Returns the user-specific site-packages directory path.
253
254 If the global variable ``USER_SITE`` is not initialized yet, this
255 function will also set it.
256 """
257 global USER_SITE
258 user_base = getuserbase() # this will also set USER_BASE
259
260 if USER_SITE is not None:
261 return USER_SITE
262
Tarek Ziadéedacea32010-01-29 11:41:03 +0000263 from sysconfig import get_path
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000264
265 if sys.platform == 'darwin':
266 from sysconfig import get_config_var
267 if get_config_var('PYTHONFRAMEWORK'):
268 USER_SITE = get_path('purelib', 'osx_framework_user')
269 return USER_SITE
270
Tarek Ziadéedacea32010-01-29 11:41:03 +0000271 USER_SITE = get_path('purelib', '%s_user' % os.name)
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000272 return USER_SITE
Christian Heimes8dc226f2008-05-06 23:45:46 +0000273
274def addusersitepackages(known_paths):
275 """Add a per user site-package to sys.path
276
277 Each user has its own python directory with site-packages in the
278 home directory.
Christian Heimes8dc226f2008-05-06 23:45:46 +0000279 """
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000280 # get the per user site-package path
281 # this call will also make sure USER_BASE and USER_SITE are set
282 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000283
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000284 if ENABLE_USER_SITE and os.path.isdir(user_site):
285 addsitedir(user_site, known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000286 return known_paths
287
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100288def getsitepackages(prefixes=None):
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000289 """Returns a list containing all global site-packages directories
290 (and possibly site-python).
Christian Heimes8dc226f2008-05-06 23:45:46 +0000291
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100292 For each directory present in ``prefixes`` (or the global ``PREFIXES``),
293 this function will find its `site-packages` subdirectory depending on the
294 system environment, and will return a list of full paths.
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000295 """
296 sitepackages = []
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000297 seen = set()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000298
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100299 if prefixes is None:
300 prefixes = PREFIXES
301
302 for prefix in prefixes:
Christian Heimes8dc226f2008-05-06 23:45:46 +0000303 if not prefix or prefix in seen:
304 continue
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000305 seen.add(prefix)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000306
Christian Heimesde0b9622012-11-19 00:59:39 +0100307 if os.sep == '/':
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000308 sitepackages.append(os.path.join(prefix, "lib",
Christian Heimes8dc226f2008-05-06 23:45:46 +0000309 "python" + sys.version[:3],
310 "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000311 sitepackages.append(os.path.join(prefix, "lib", "site-python"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000312 else:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000313 sitepackages.append(prefix)
314 sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000315 if sys.platform == "darwin":
316 # for framework builds *only* we add the standard Apple
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000317 # locations.
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000318 from sysconfig import get_config_var
319 framework = get_config_var("PYTHONFRAMEWORK")
Ronald Oussorenbda46722010-08-01 09:02:50 +0000320 if framework:
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000321 sitepackages.append(
Ronald Oussoren4cda46a2010-05-08 10:49:43 +0000322 os.path.join("/Library", framework,
Ronald Oussorenfa1fcd12009-03-30 23:16:10 +0000323 sys.version[:3], "site-packages"))
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000324 return sitepackages
Christian Heimes8dc226f2008-05-06 23:45:46 +0000325
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100326def addsitepackages(known_paths, prefixes=None):
Tarek Ziadé4a608c02009-08-20 21:28:05 +0000327 """Add site-packages (and possibly site-python) to sys.path"""
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100328 for sitedir in getsitepackages(prefixes):
Christian Heimes8dc226f2008-05-06 23:45:46 +0000329 if os.path.isdir(sitedir):
330 addsitedir(sitedir, known_paths)
331
332 return known_paths
Fred Drake7f5296e2001-07-20 20:06:17 +0000333
Brett Cannon0096e262004-06-05 01:12:51 +0000334def setquit():
Brian Curtinfb1d3c12010-04-12 23:33:42 +0000335 """Define new builtins 'quit' and 'exit'.
336
337 These are objects which make the interpreter exit when called.
338 The repr of each object contains a hint at how it works.
Guido van Rossumd89fa0c1998-08-07 18:01:14 +0000339
Brett Cannon0096e262004-06-05 01:12:51 +0000340 """
341 if os.sep == ':':
Georg Brandl24cb0532006-03-09 23:22:06 +0000342 eof = 'Cmd-Q'
Brett Cannon0096e262004-06-05 01:12:51 +0000343 elif os.sep == '\\':
Georg Brandl24cb0532006-03-09 23:22:06 +0000344 eof = 'Ctrl-Z plus Return'
Brett Cannon0096e262004-06-05 01:12:51 +0000345 else:
Georg Brandl24cb0532006-03-09 23:22:06 +0000346 eof = 'Ctrl-D (i.e. EOF)'
Tim Peters88ca4672006-03-10 23:39:56 +0000347
Antoine Pitrou853395b2013-08-06 22:56:40 +0200348 builtins.quit = _sitebuiltins.Quitter('quit', eof)
349 builtins.exit = _sitebuiltins.Quitter('exit', eof)
Brett Cannon0096e262004-06-05 01:12:51 +0000350
351
Brett Cannon0096e262004-06-05 01:12:51 +0000352def setcopyright():
Georg Brandl1a3284e2007-12-02 09:40:06 +0000353 """Set 'copyright' and 'credits' in builtins"""
Antoine Pitrou853395b2013-08-06 22:56:40 +0200354 builtins.copyright = _sitebuiltins._Printer("copyright", sys.copyright)
Brett Cannon0096e262004-06-05 01:12:51 +0000355 if sys.platform[:4] == 'java':
Antoine Pitrou853395b2013-08-06 22:56:40 +0200356 builtins.credits = _sitebuiltins._Printer(
Brett Cannon0096e262004-06-05 01:12:51 +0000357 "credits",
Antoine Pitrouf93c7b82013-08-01 19:46:04 +0200358 "Jython is maintained by the Jython developers (www.jython.org).")
Brett Cannon0096e262004-06-05 01:12:51 +0000359 else:
Antoine Pitrou853395b2013-08-06 22:56:40 +0200360 builtins.credits = _sitebuiltins._Printer("credits", """\
Brett Cannon0096e262004-06-05 01:12:51 +0000361 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
Antoine Pitrouf93c7b82013-08-01 19:46:04 +0200362 for supporting Python development. See www.python.org for more information.""")
Brett Cannon0096e262004-06-05 01:12:51 +0000363 here = os.path.dirname(os.__file__)
Antoine Pitrou853395b2013-08-06 22:56:40 +0200364 builtins.license = _sitebuiltins._Printer(
R David Murray692ee9e2013-09-14 13:31:44 -0400365 "license",
366 "See http://www.python.org/download/releases/%.5s/license" % sys.version,
Brett Cannon0096e262004-06-05 01:12:51 +0000367 ["LICENSE.txt", "LICENSE"],
Antoine Pitrouf93c7b82013-08-01 19:46:04 +0200368 [os.path.join(here, os.pardir), here, os.curdir])
Guido van Rossumd1252392000-09-05 04:39:55 +0000369
370
Brett Cannon0096e262004-06-05 01:12:51 +0000371def sethelper():
Antoine Pitrou853395b2013-08-06 22:56:40 +0200372 builtins.help = _sitebuiltins._Helper()
Brett Cannon0096e262004-06-05 01:12:51 +0000373
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200374def enablerlcompleter():
375 """Enable default readline configuration on interactive prompts, by
376 registering a sys.__interactivehook__.
377
378 If the readline module can be imported, the hook will set the Tab key
379 as completion key and register ~/.python_history as history file.
380 This can be overriden in the sitecustomize or usercustomize module,
381 or in a PYTHONSTARTUP file.
382 """
383 def register_readline():
384 import atexit
385 try:
386 import readline
387 import rlcompleter
Brett Cannoncd171c82013-07-04 17:43:24 -0400388 except ImportError:
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200389 return
390
391 # Reading the initialization (config) file may not be enough to set a
R David Murray4a043012013-09-06 13:08:08 -0400392 # completion key, so we set one first and then read the file.
393 readline_doc = getattr(readline, '__doc__', '')
394 if readline_doc is not None and 'libedit' in readline_doc:
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200395 readline.parse_and_bind('bind ^I rl_complete')
396 else:
397 readline.parse_and_bind('tab: complete')
Mark Dickinson9d351332013-05-06 15:39:31 +0200398
399 try:
400 readline.read_init_file()
401 except OSError:
402 # An OSError here could have many causes, but the most likely one
403 # is that there's no .inputrc file (or .editrc file in the case of
404 # Mac OS X + libedit) in the expected location. In that case, we
405 # want to ignore the exception.
406 pass
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200407
Antoine Pitrou5d23e6d2013-09-29 22:18:38 +0200408 if readline.get_history_item(1) is None:
409 # If no history was loaded, default to .python_history.
410 # The guard is necessary to avoid doubling history size at
411 # each interpreter exit when readline was already configured
412 # through a PYTHONSTARTUP hook, see:
413 # http://bugs.python.org/issue5845#msg198636
414 history = os.path.join(os.path.expanduser('~'),
415 '.python_history')
416 try:
417 readline.read_history_file(history)
418 except IOError:
419 pass
420 atexit.register(readline.write_history_file, history)
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200421
422 sys.__interactivehook__ = register_readline
423
Brett Cannon0096e262004-06-05 01:12:51 +0000424def aliasmbcs():
425 """On Windows, some default encodings are not provided by Python,
426 while they are always available as "mbcs" in each locale. Make
427 them usable by aliasing to "mbcs" in such a case."""
428 if sys.platform == 'win32':
429 import locale, codecs
430 enc = locale.getdefaultlocale()[1]
431 if enc.startswith('cp'): # "cp***" ?
432 try:
433 codecs.lookup(enc)
434 except LookupError:
435 import encodings
436 encodings._cache[enc] = encodings._unknown
437 encodings.aliases.aliases[enc] = 'mbcs'
438
Guido van Rossum83213cc2001-06-12 16:48:52 +0000439
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100440CONFIG_LINE = re.compile(r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$')
441
442def venv(known_paths):
443 global PREFIXES, ENABLE_USER_SITE
444
445 env = os.environ
Vinay Sajip28952442012-06-25 00:47:46 +0100446 if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env:
447 executable = os.environ['__PYVENV_LAUNCHER__']
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100448 else:
449 executable = sys.executable
Vinay Sajip27e4b602012-11-23 19:16:49 +0000450 exe_dir, _ = os.path.split(os.path.abspath(executable))
451 site_prefix = os.path.dirname(exe_dir)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100452 sys._home = None
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100453 conf_basename = 'pyvenv.cfg'
454 candidate_confs = [
455 conffile for conffile in (
Vinay Sajip27e4b602012-11-23 19:16:49 +0000456 os.path.join(exe_dir, conf_basename),
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100457 os.path.join(site_prefix, conf_basename)
458 )
459 if os.path.isfile(conffile)
460 ]
461
462 if candidate_confs:
463 virtual_conf = candidate_confs[0]
464 system_site = "true"
465 with open(virtual_conf) as f:
466 for line in f:
467 line = line.strip()
468 m = CONFIG_LINE.match(line)
469 if m:
470 d = m.groupdict()
471 key, value = d['key'].lower(), d['value']
472 if key == 'include-system-site-packages':
473 system_site = value.lower()
474 elif key == 'home':
475 sys._home = value
476
477 sys.prefix = sys.exec_prefix = site_prefix
478
479 # Doing this here ensures venv takes precedence over user-site
480 addsitepackages(known_paths, [sys.prefix])
481
482 # addsitepackages will process site_prefix again if its in PREFIXES,
483 # but that's ok; known_paths will prevent anything being added twice
484 if system_site == "true":
485 PREFIXES.insert(0, sys.prefix)
486 else:
487 PREFIXES = [sys.prefix]
488 ENABLE_USER_SITE = False
489
490 return known_paths
491
492
Brett Cannon0096e262004-06-05 01:12:51 +0000493def execsitecustomize():
494 """Run custom site specific code, if available."""
495 try:
496 import sitecustomize
Brett Cannoncd171c82013-07-04 17:43:24 -0400497 except ImportError:
Brett Cannon0096e262004-06-05 01:12:51 +0000498 pass
Guido van Rossumb940e112007-01-10 16:19:56 +0000499 except Exception as err:
Guido van Rossumc6fe9832006-08-19 00:10:28 +0000500 if os.environ.get("PYTHONVERBOSE"):
Victor Stinner52f6dd72010-03-12 14:45:56 +0000501 sys.excepthook(*sys.exc_info())
502 else:
503 sys.stderr.write(
504 "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
505 "%s: %s\n" %
506 (err.__class__.__name__, err))
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000507
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000508
Christian Heimes8dc226f2008-05-06 23:45:46 +0000509def execusercustomize():
510 """Run custom user specific code, if available."""
511 try:
512 import usercustomize
Brett Cannoncd171c82013-07-04 17:43:24 -0400513 except ImportError:
Christian Heimes8dc226f2008-05-06 23:45:46 +0000514 pass
Victor Stinner52f6dd72010-03-12 14:45:56 +0000515 except Exception as err:
516 if os.environ.get("PYTHONVERBOSE"):
517 sys.excepthook(*sys.exc_info())
518 else:
519 sys.stderr.write(
520 "Error in usercustomize; set PYTHONVERBOSE for traceback:\n"
521 "%s: %s\n" %
522 (err.__class__.__name__, err))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000523
524
Brett Cannon0096e262004-06-05 01:12:51 +0000525def main():
Éric Araujoc09fca62011-03-23 02:06:24 +0100526 """Add standard site-specific directories to the module search path.
527
528 This function is called automatically when this module is imported,
529 unless the python interpreter was started with the -S flag.
530 """
Christian Heimes8dc226f2008-05-06 23:45:46 +0000531 global ENABLE_USER_SITE
532
Barry Warsaw28a691b2010-04-17 00:19:56 +0000533 abs_paths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000534 known_paths = removeduppaths()
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100535 known_paths = venv(known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000536 if ENABLE_USER_SITE is None:
537 ENABLE_USER_SITE = check_enableusersite()
538 known_paths = addusersitepackages(known_paths)
539 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000540 setquit()
541 setcopyright()
542 sethelper()
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200543 enablerlcompleter()
Brett Cannon0096e262004-06-05 01:12:51 +0000544 aliasmbcs()
Brett Cannon0096e262004-06-05 01:12:51 +0000545 execsitecustomize()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000546 if ENABLE_USER_SITE:
547 execusercustomize()
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000548
Éric Araujoc09fca62011-03-23 02:06:24 +0100549# Prevent edition of sys.path when python was started with -S and
550# site is imported later.
551if not sys.flags.no_site:
552 main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000553
Christian Heimes8dc226f2008-05-06 23:45:46 +0000554def _script():
555 help = """\
556 %s [--user-base] [--user-site]
557
558 Without arguments print some useful information
559 With arguments print the value of USER_BASE and/or USER_SITE separated
560 by '%s'.
561
562 Exit codes with --user-base or --user-site:
563 0 - user site directory is enabled
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000564 1 - user site directory is disabled by user
Christian Heimes8dc226f2008-05-06 23:45:46 +0000565 2 - uses site directory is disabled by super user
566 or for security reasons
567 >2 - unknown error
568 """
569 args = sys.argv[1:]
570 if not args:
Meador Inge9a7a8112013-04-13 20:29:49 -0500571 user_base = getuserbase()
572 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000573 print("sys.path = [")
574 for dir in sys.path:
575 print(" %r," % (dir,))
576 print("]")
Meador Inge9a7a8112013-04-13 20:29:49 -0500577 print("USER_BASE: %r (%s)" % (user_base,
578 "exists" if os.path.isdir(user_base) else "doesn't exist"))
579 print("USER_SITE: %r (%s)" % (user_site,
580 "exists" if os.path.isdir(user_site) else "doesn't exist"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000581 print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
582 sys.exit(0)
583
584 buffer = []
585 if '--user-base' in args:
586 buffer.append(USER_BASE)
587 if '--user-site' in args:
588 buffer.append(USER_SITE)
589
590 if buffer:
591 print(os.pathsep.join(buffer))
592 if ENABLE_USER_SITE:
593 sys.exit(0)
594 elif ENABLE_USER_SITE is False:
595 sys.exit(1)
596 elif ENABLE_USER_SITE is None:
597 sys.exit(2)
598 else:
599 sys.exit(3)
600 else:
601 import textwrap
602 print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
603 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000604
605if __name__ == '__main__':
Christian Heimes8dc226f2008-05-06 23:45:46 +0000606 _script()