blob: 525026675539fa0637f7cefd39c998719fb804dd [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
Martin Pantere26da7c2016-06-02 10:07:09 +000062completion for systems that support it. This can be overridden in
Antoine Pitrou1a6cb302013-05-04 20:08:35 +020063sitecustomize, 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 Cannon5f0507d2016-04-08 15:04:28 -0700134 """Return a set containing all existing file system items from sys.path."""
Brett Cannon0096e262004-06-05 01:12:51 +0000135 d = set()
Brett Cannon5f0507d2016-04-08 15:04:28 -0700136 for item in sys.path:
Brett Cannon0096e262004-06-05 01:12:51 +0000137 try:
Brett Cannon5f0507d2016-04-08 15:04:28 -0700138 if os.path.exists(item):
139 _, itemcase = makepath(item)
140 d.add(itemcase)
Brett Cannon0096e262004-06-05 01:12:51 +0000141 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()
Brett Cannon5f0507d2016-04-08 15:04:28 -0700153 reset = True
Fred Drake7f5296e2001-07-20 20:06:17 +0000154 else:
Brett Cannon5f0507d2016-04-08 15:04:28 -0700155 reset = False
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 Cannon5f0507d2016-04-08 15:04:28 -0700193 reset = True
Brett Cannon0096e262004-06-05 01:12:51 +0000194 else:
Brett Cannon5f0507d2016-04-08 15:04:28 -0700195 reset = False
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",
Serhiy Storchaka885bdc42016-02-11 13:10:36 +0200307 "python%d.%d" % sys.version_info[:2],
Christian Heimes8dc226f2008-05-06 23:45:46 +0000308 "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,
Serhiy Storchaka885bdc42016-02-11 13:10:36 +0200320 '%d.%d' % sys.version_info[:2], "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.
Martin Pantere26da7c2016-06-02 10:07:09 +0000382 This can be overridden in the sitecustomize or usercustomize module,
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200383 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
Christian Heimes8c9cd5a2013-10-12 00:24:55 +0200426CONFIG_LINE = r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$'
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100427
428def venv(known_paths):
429 global PREFIXES, ENABLE_USER_SITE
430
431 env = os.environ
Vinay Sajip28952442012-06-25 00:47:46 +0100432 if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env:
433 executable = os.environ['__PYVENV_LAUNCHER__']
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100434 else:
435 executable = sys.executable
Vinay Sajip27e4b602012-11-23 19:16:49 +0000436 exe_dir, _ = os.path.split(os.path.abspath(executable))
437 site_prefix = os.path.dirname(exe_dir)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100438 sys._home = None
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100439 conf_basename = 'pyvenv.cfg'
440 candidate_confs = [
441 conffile for conffile in (
Vinay Sajip27e4b602012-11-23 19:16:49 +0000442 os.path.join(exe_dir, conf_basename),
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100443 os.path.join(site_prefix, conf_basename)
444 )
445 if os.path.isfile(conffile)
446 ]
447
448 if candidate_confs:
Christian Heimes8c9cd5a2013-10-12 00:24:55 +0200449 import re
450 config_line = re.compile(CONFIG_LINE)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100451 virtual_conf = candidate_confs[0]
452 system_site = "true"
Vinay Sajipf223c532015-10-01 11:27:00 +0100453 # Issue 25185: Use UTF-8, as that's what the venv module uses when
454 # writing the file.
455 with open(virtual_conf, encoding='utf-8') as f:
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100456 for line in f:
457 line = line.strip()
Christian Heimesbfc3a9a2013-10-12 00:28:17 +0200458 m = config_line.match(line)
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100459 if m:
460 d = m.groupdict()
461 key, value = d['key'].lower(), d['value']
462 if key == 'include-system-site-packages':
463 system_site = value.lower()
464 elif key == 'home':
465 sys._home = value
466
467 sys.prefix = sys.exec_prefix = site_prefix
468
469 # Doing this here ensures venv takes precedence over user-site
470 addsitepackages(known_paths, [sys.prefix])
471
472 # addsitepackages will process site_prefix again if its in PREFIXES,
473 # but that's ok; known_paths will prevent anything being added twice
474 if system_site == "true":
475 PREFIXES.insert(0, sys.prefix)
476 else:
477 PREFIXES = [sys.prefix]
478 ENABLE_USER_SITE = False
479
480 return known_paths
481
482
Brett Cannon0096e262004-06-05 01:12:51 +0000483def execsitecustomize():
484 """Run custom site specific code, if available."""
485 try:
Victor Stinnere3560a72016-01-22 12:22:07 +0100486 try:
487 import sitecustomize
488 except ImportError as exc:
489 if exc.name == 'sitecustomize':
490 pass
491 else:
492 raise
Guido van Rossumb940e112007-01-10 16:19:56 +0000493 except Exception as err:
Guido van Rossumc6fe9832006-08-19 00:10:28 +0000494 if os.environ.get("PYTHONVERBOSE"):
Victor Stinner52f6dd72010-03-12 14:45:56 +0000495 sys.excepthook(*sys.exc_info())
496 else:
497 sys.stderr.write(
498 "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
499 "%s: %s\n" %
500 (err.__class__.__name__, err))
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000501
Martin v. Löwis4eab4862003-03-03 09:34:01 +0000502
Christian Heimes8dc226f2008-05-06 23:45:46 +0000503def execusercustomize():
504 """Run custom user specific code, if available."""
505 try:
Victor Stinnere3560a72016-01-22 12:22:07 +0100506 try:
507 import usercustomize
508 except ImportError as exc:
509 if exc.name == 'usercustomize':
510 pass
511 else:
512 raise
Victor Stinner52f6dd72010-03-12 14:45:56 +0000513 except Exception as err:
514 if os.environ.get("PYTHONVERBOSE"):
515 sys.excepthook(*sys.exc_info())
516 else:
517 sys.stderr.write(
518 "Error in usercustomize; set PYTHONVERBOSE for traceback:\n"
519 "%s: %s\n" %
520 (err.__class__.__name__, err))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000521
522
Brett Cannon0096e262004-06-05 01:12:51 +0000523def main():
Éric Araujoc09fca62011-03-23 02:06:24 +0100524 """Add standard site-specific directories to the module search path.
525
526 This function is called automatically when this module is imported,
527 unless the python interpreter was started with the -S flag.
528 """
Christian Heimes8dc226f2008-05-06 23:45:46 +0000529 global ENABLE_USER_SITE
530
Barry Warsaw28a691b2010-04-17 00:19:56 +0000531 abs_paths()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000532 known_paths = removeduppaths()
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100533 known_paths = venv(known_paths)
Christian Heimes8dc226f2008-05-06 23:45:46 +0000534 if ENABLE_USER_SITE is None:
535 ENABLE_USER_SITE = check_enableusersite()
536 known_paths = addusersitepackages(known_paths)
537 known_paths = addsitepackages(known_paths)
Brett Cannon0096e262004-06-05 01:12:51 +0000538 setquit()
539 setcopyright()
540 sethelper()
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200541 enablerlcompleter()
Brett Cannon0096e262004-06-05 01:12:51 +0000542 execsitecustomize()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000543 if ENABLE_USER_SITE:
544 execusercustomize()
Marc-André Lemburg990bbe92000-06-07 09:12:09 +0000545
Éric Araujoc09fca62011-03-23 02:06:24 +0100546# Prevent edition of sys.path when python was started with -S and
547# site is imported later.
548if not sys.flags.no_site:
549 main()
Guido van Rossumf30bec71997-08-29 22:30:45 +0000550
Christian Heimes8dc226f2008-05-06 23:45:46 +0000551def _script():
552 help = """\
553 %s [--user-base] [--user-site]
554
555 Without arguments print some useful information
556 With arguments print the value of USER_BASE and/or USER_SITE separated
557 by '%s'.
558
559 Exit codes with --user-base or --user-site:
560 0 - user site directory is enabled
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000561 1 - user site directory is disabled by user
Christian Heimes8dc226f2008-05-06 23:45:46 +0000562 2 - uses site directory is disabled by super user
563 or for security reasons
564 >2 - unknown error
565 """
566 args = sys.argv[1:]
567 if not args:
Meador Inge9a7a8112013-04-13 20:29:49 -0500568 user_base = getuserbase()
569 user_site = getusersitepackages()
Christian Heimes8dc226f2008-05-06 23:45:46 +0000570 print("sys.path = [")
571 for dir in sys.path:
572 print(" %r," % (dir,))
573 print("]")
Meador Inge9a7a8112013-04-13 20:29:49 -0500574 print("USER_BASE: %r (%s)" % (user_base,
575 "exists" if os.path.isdir(user_base) else "doesn't exist"))
576 print("USER_SITE: %r (%s)" % (user_site,
577 "exists" if os.path.isdir(user_site) else "doesn't exist"))
Christian Heimes8dc226f2008-05-06 23:45:46 +0000578 print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
579 sys.exit(0)
580
581 buffer = []
582 if '--user-base' in args:
583 buffer.append(USER_BASE)
584 if '--user-site' in args:
585 buffer.append(USER_SITE)
586
587 if buffer:
588 print(os.pathsep.join(buffer))
589 if ENABLE_USER_SITE:
590 sys.exit(0)
591 elif ENABLE_USER_SITE is False:
592 sys.exit(1)
593 elif ENABLE_USER_SITE is None:
594 sys.exit(2)
595 else:
596 sys.exit(3)
597 else:
598 import textwrap
599 print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
600 sys.exit(10)
Guido van Rossumf30bec71997-08-29 22:30:45 +0000601
602if __name__ == '__main__':
Christian Heimes8dc226f2008-05-06 23:45:46 +0000603 _script()