-
-
Notifications
You must be signed in to change notification settings - Fork 258
/
bootstrap.py
79 lines (59 loc) · 2.74 KB
/
bootstrap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# coding=utf-8
# Copyright 2018 Pants project contributors (see CONTRIBUTORS.md).
# Licensed under the Apache License, Version 2.0 (see LICENSE).
import os
class Bootstrap(object):
"""Supports introspection of the PEX bootstrap code."""
_INSTANCE = None
@classmethod
def locate(cls):
"""Locates the active PEX bootstrap.
:rtype: :class:`Bootstrap`
"""
if cls._INSTANCE is None:
bootstrap_path = __file__
module_import_path = __name__.split(".")
# For example, our __file__ might be requests.pex/.bootstrap/pex/bootstrap.pyc and our import
# path pex.bootstrap; so we walk back through all the module components of our import path to
# find the base sys.path entry where we were found (requests.pex/.bootstrap in this example).
for _ in module_import_path:
bootstrap_path = os.path.dirname(bootstrap_path)
cls._INSTANCE = cls(sys_path_entry=bootstrap_path)
return cls._INSTANCE
def __init__(self, sys_path_entry):
self._sys_path_entry = sys_path_entry
self._realpath = os.path.realpath(self._sys_path_entry)
def demote(self):
"""Demote the bootstrap code to the end of the `sys.path` so it is found last.
:return: The list of un-imported bootstrap modules.
:rtype: list of :class:`types.ModuleType`
"""
import sys # Grab a hold of `sys` early since we'll be un-importing our module in this process.
unimported_modules = []
for name, module in reversed(sorted(sys.modules.items())):
if self.imported_from_bootstrap(module):
unimported_modules.append(sys.modules.pop(name))
sys.path[:] = [path for path in sys.path if os.path.realpath(path) != self._realpath]
sys.path.append(self._sys_path_entry)
return unimported_modules
def imported_from_bootstrap(self, module):
"""Return ``True`` if the given ``module`` object was imported from bootstrap code.
:param module: The module to check the provenance of.
:type module: :class:`types.ModuleType`
:rtype: bool
"""
# A vendored module.
path = getattr(module, "__file__", None)
if path and os.path.realpath(path).startswith(self._realpath):
return True
# A vendored package.
path = getattr(module, "__path__", None)
if path and any(
os.path.realpath(path_item).startswith(self._realpath) for path_item in path
):
return True
return False
def __repr__(self):
return "{cls}(sys_path_entry={sys_path_entry!r})".format(
cls=type(self).__name__, sys_path_entry=self._sys_path_entry
)