blob: 77d198a55b2e58a606b0067400bf680d9bb5c795 [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(
Brett Cannon0096e262004-06-05 01:12:51 +0000365 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
366 ["LICENSE.txt", "LICENSE"],
Antoine Pitrouf93c7b82013-08-01 19:46:04 +0200367 [os.path.join(here, os.pardir), here, os.curdir])
Guido van Rossumd1252392000-09-05 04:39:55 +0000368
369
Brett Cannon0096e262004-06-05 01:12:51 +0000370def sethelper():
Antoine Pitrou853395b2013-08-06 22:56:40 +0200371 builtins.help = _sitebuiltins._Helper()
Brett Cannon0096e262004-06-05 01:12:51 +0000372
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200373def enablerlcompleter():
374 """Enable default readline configuration on interactive prompts, by
375 registering a sys.__interactivehook__.
376
377 If the readline module can be imported, the hook will set the Tab key
378 as completion key and register ~/.python_history as history file.
379 This can be overriden in the sitecustomize or usercustomize module,
380 or in a PYTHONSTARTUP file.
381 """
382 def register_readline():
383 import atexit
384 try:
385 import readline
386 import rlcompleter
Brett Cannoncd171c82013-07-04 17:43:24 -0400387 except ImportError:
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200388 return
389
390 # Reading the initialization (config) file may not be enough to set a
391 # completion key, so we set one first and then read the file
392 if 'libedit' in getattr(readline, '__doc__', ''):
393 readline.parse_and_bind('bind ^I rl_complete')
394 else:
395 readline.parse_and_bind('tab: complete')
Mark Dickinson9d351332013-05-06 15:39:31 +0200396
397 try:
398 readline.read_init_file()
399 except OSError:
400 # An OSError here could have many causes, but the most likely one
401 # is that there's no .inputrc file (or .editrc file in the case of
402 # Mac OS X + libedit) in the expected location. In that case, we
403 # want to ignore the exception.
404 pass
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200405
406 history = os.path.join(os.path.expanduser('~'), '.python_history')
407 try:
408 readline.read_history_file(history)
409 except IOError:
410 pass
411 atexit.register(readline.write_history_file, history)
412
413 sys.__interactivehook__ = register_readline
414
Brett Cannon0096e262004-06-05 01:12:51 +0000415def aliasmbcs():
416 """On Windows, some default encodings are not provided by Python,
417 while they are always available as "mbcs" in each locale. Make
418 them usable by aliasing to "mbcs" in such a case."""
419 if sys.platform == 'win32':
420 import locale, codecs
421 enc = locale.getdefaultlocale()[1]
422 if enc.startswith('cp'): # "cp***" ?
423 try:
424 codecs.lookup(enc)
425 except LookupError:
426 import encodings
427 encodings._cache[enc] = encodings._unknown
428 encodings.aliases.aliases[enc] = 'mbcs'
429
Guido van Rossum83213cc2001-06-12 16:48:52 +0000430
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100431CONFIG_LINE = re.compile(r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$')
432
433def venv(known_paths):
434 global PREFIXES, ENABLE_USER_SITE
435
436 env = os.environ
Vinay Sajip28952442012-06-25 00:47:46 +0100437 if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env:
438 executable = os.environ['__PYVENV_LAUNCHER__']
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100439 else:
440 executable = sys.executable
Vinay Sajip27e4b602012-11-23 19:16:49 +0000441 exe_dir, _ = os.path.split(os.path.abspath(executable))
442 site_prefix = os.path.dirname(exe_dir)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100443 sys._home = None
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100444 conf_basename = 'pyvenv.cfg'
445 candidate_confs = [
446 conffile for conffile in (
Vinay Sajip27e4b602012-11-23 19:16:49 +0000447 os.path.join(exe_dir, conf_basename),
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100448 os.path.join(site_prefix, conf_basename)
449 )
450 if os.path.isfile(conffile)
451 ]
452
453 if candidate_confs:
454 virtual_conf = candidate_confs[0]
455 system_site = "true"
456 with open(virtual_conf) as f:
457 for line in f:
458 line = line.strip()
459 m = CONFIG_LINE.match(line)
460 if m:
461 d = m.groupdict()
462 key, value = d['key'].lower(), d['value']
463 if key == 'include-system-site-packages':
464 system_site = value.lower()
465 elif key == 'home':
466 sys._home = value
467
468 sys.prefix = sys.exec_prefix = site_prefix
469
470 # Doing this here ensures venv takes precedence over user-site
471 addsitepackages(known_paths, [sys.prefix])
472
473 # addsitepackages will process site_prefix again if its in PREFIXES,
474 # but that's ok; known_paths will prevent anything being added twice
475 if system_site == "true":
476 PREFIXES.insert(0, sys.prefix)
477 else:
478 PREFIXES = [sys.prefix]
479 ENABLE_USER_SITE = False
480
481 return known_paths
482
483
Brett Cannon0096e262004-06-05 01:12:51 +0000484def execsitecustomize():
485 """Run custom site specific code, if available."""
486 try:
487 import sitecustomize
Brett Cannoncd171c82013-07-04 17:43:24 -0400488 except ImportError:
Brett Cannon0096e262004-06-05 01:12:51 +0000489 pass
Guido van Rossumb940e112007-01-10 16:19:56 +0000490 except Exception as err:
Guido van Rossumc6fe9832006-08-19 00:10:28 +0000491 if os.environ.get("PYTHONVERBOSE"):
Victor Stinner52f6dd72010-03-12 14:45:56 +0000492 sys.excepthook(*sys.exc_info())
493 else:
494 sys.stderr.write(
495 "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
496 "%s: %s\n" %
497 (err.__class__.__name__, err))
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000498
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000499
Christian Heimes8dc226f2008-05-06 23:45:46 +0000500def execusercustomize():
501 """Run custom user specific code, if available."""
502 try:
503 import usercustomize
Brett Cannoncd171c82013-07-04 17:43:24 -0400504 except ImportError:
Christian Heimes8dc226f2008-05-06 23:45:46 +0000505 pass
Victor Stinner52f6dd72010-03-12 14:45:56 +0000506 except Exception as err:
507 if os.environ.get("PYTHONVERBOSE"):
508 sys.excepthook(*sys.exc_info())
509 else:
510 sys.stderr.write(
511 "Error in usercustomize; set PYTHONVERBOSE for traceback:\n"
512 "%s: %s\n" %
513 (err.__class__.__name__, err))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000514
515
Brett Cannon0096e262004-06-05 01:12:51 +0000516def main():
Éric Araujoc09fca62011-03-23 02:06:24 +0100517 """Add standard site-specific directories to the module search path.
518
519 This function is called automatically when this module is imported,
520 unless the python interpreter was started with the -S flag.
521 """
Christian Heimes8dc226f2008-05-06 23:45:46 +0000522 global ENABLE_USER_SITE
523
Barry Warsaw28a691b2010-04-17 00:19:56 +0000524 abs_paths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000525 known_paths = removeduppaths()
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100526 known_paths = venv(known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000527 if ENABLE_USER_SITE is None:
528 ENABLE_USER_SITE = check_enableusersite()
529 known_paths = addusersitepackages(known_paths)
530 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000531 setquit()
532 setcopyright()
533 sethelper()
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200534 enablerlcompleter()
Brett Cannon0096e262004-06-05 01:12:51 +0000535 aliasmbcs()
Brett Cannon0096e262004-06-05 01:12:51 +0000536 execsitecustomize()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000537 if ENABLE_USER_SITE:
538 execusercustomize()
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000539
Éric Araujoc09fca62011-03-23 02:06:24 +0100540# Prevent edition of sys.path when python was started with -S and
541# site is imported later.
542if not sys.flags.no_site:
543 main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000544
Christian Heimes8dc226f2008-05-06 23:45:46 +0000545def _script():
546 help = """\
547 %s [--user-base] [--user-site]
548
549 Without arguments print some useful information
550 With arguments print the value of USER_BASE and/or USER_SITE separated
551 by '%s'.
552
553 Exit codes with --user-base or --user-site:
554 0 - user site directory is enabled
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000555 1 - user site directory is disabled by user
Christian Heimes8dc226f2008-05-06 23:45:46 +0000556 2 - uses site directory is disabled by super user
557 or for security reasons
558 >2 - unknown error
559 """
560 args = sys.argv[1:]
561 if not args:
Meador Inge9a7a8112013-04-13 20:29:49 -0500562 user_base = getuserbase()
563 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000564 print("sys.path = [")
565 for dir in sys.path:
566 print(" %r," % (dir,))
567 print("]")
Meador Inge9a7a8112013-04-13 20:29:49 -0500568 print("USER_BASE: %r (%s)" % (user_base,
569 "exists" if os.path.isdir(user_base) else "doesn't exist"))
570 print("USER_SITE: %r (%s)" % (user_site,
571 "exists" if os.path.isdir(user_site) else "doesn't exist"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000572 print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
573 sys.exit(0)
574
575 buffer = []
576 if '--user-base' in args:
577 buffer.append(USER_BASE)
578 if '--user-site' in args:
579 buffer.append(USER_SITE)
580
581 if buffer:
582 print(os.pathsep.join(buffer))
583 if ENABLE_USER_SITE:
584 sys.exit(0)
585 elif ENABLE_USER_SITE is False:
586 sys.exit(1)
587 elif ENABLE_USER_SITE is None:
588 sys.exit(2)
589 else:
590 sys.exit(3)
591 else:
592 import textwrap
593 print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
594 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000595
596if __name__ == '__main__':
Christian Heimes8dc226f2008-05-06 23:45:46 +0000597 _script()