| 112 | return s |
| 113 | |
| 114 | class ModuleFinder: |
| 115 | |
| 116 | def __init__(self, path=None, debug=0, excludes=None, replace_paths=None): |
| 117 | if path is None: |
| 118 | path = sys.path |
| 119 | self.path = path |
| 120 | self.modules = {} |
| 121 | self.badmodules = {} |
| 122 | self.debug = debug |
| 123 | self.indent = 0 |
| 124 | self.excludes = excludes if excludes is not None else [] |
| 125 | self.replace_paths = replace_paths if replace_paths is not None else [] |
| 126 | self.processed_paths = [] # Used in debugging only |
| 127 | |
| 128 | def msg(self, level, str, *args): |
| 129 | if level <= self.debug: |
| 130 | for i in range(self.indent): |
| 131 | print(" ", end=' ') |
| 132 | print(str, end=' ') |
| 133 | for arg in args: |
| 134 | print(repr(arg), end=' ') |
| 135 | print() |
| 136 | |
| 137 | def msgin(self, *args): |
| 138 | level = args[0] |
| 139 | if level <= self.debug: |
| 140 | self.indent = self.indent + 1 |
| 141 | self.msg(*args) |
| 142 | |
| 143 | def msgout(self, *args): |
| 144 | level = args[0] |
| 145 | if level <= self.debug: |
| 146 | self.indent = self.indent - 1 |
| 147 | self.msg(*args) |
| 148 | |
| 149 | def run_script(self, pathname): |
| 150 | self.msg(2, "run_script", pathname) |
| 151 | with io.open_code(pathname) as fp: |
| 152 | stuff = ("", "rb", _PY_SOURCE) |
| 153 | self.load_module('__main__', fp, pathname, stuff) |
| 154 | |
| 155 | def load_file(self, pathname): |
| 156 | dir, name = os.path.split(pathname) |
| 157 | name, ext = os.path.splitext(name) |
| 158 | with io.open_code(pathname) as fp: |
| 159 | stuff = (ext, "rb", _PY_SOURCE) |
| 160 | self.load_module(name, fp, pathname, stuff) |
| 161 | |
| 162 | def import_hook(self, name, caller=None, fromlist=None, level=-1): |
| 163 | self.msg(3, "import_hook", name, caller, fromlist, level) |
| 164 | parent = self.determine_parent(caller, level=level) |
| 165 | q, tail = self.find_head_package(parent, name) |
| 166 | m = self.load_tail(q, tail) |
| 167 | if not fromlist: |
| 168 | return q |
| 169 | if m.__path__: |
| 170 | self.ensure_fromlist(m, fromlist) |
| 171 | return None |