diff options
Diffstat (limited to 'Lib/modulefinder.py')
| -rw-r--r-- | Lib/modulefinder.py | 55 |
1 files changed, 13 insertions, 42 deletions
diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py index f033ba9..264b0f0 100644 --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -1,16 +1,14 @@ """Find modules used by a script, using introspection.""" -from __future__ import generators import dis import imp +import importlib.machinery import marshal import os import sys import types import struct -READ_MODE = "rU" - # XXX Clean up once str8's cstor matches bytes. LOAD_CONST = bytes([dis.opname.index('LOAD_CONST')]) IMPORT_NAME = bytes([dis.opname.index('IMPORT_NAME')]) @@ -29,9 +27,7 @@ packagePathMap = {} # A Public interface def AddPackagePath(packagename, path): - paths = packagePathMap.get(packagename, []) - paths.append(path) - packagePathMap[packagename] = paths + packagePathMap.setdefault(packagename, []).append(path) replacePackageMap = {} @@ -106,14 +102,14 @@ class ModuleFinder: def run_script(self, pathname): self.msg(2, "run_script", pathname) - with open(pathname, READ_MODE) as fp: + with open(pathname) as fp: stuff = ("", "r", imp.PY_SOURCE) self.load_module('__main__', fp, pathname, stuff) def load_file(self, pathname): dir, name = os.path.split(pathname) name, ext = os.path.splitext(name) - with open(pathname, READ_MODE) as fp: + with open(pathname) as fp: stuff = (ext, "r", imp.PY_SOURCE) self.load_module(name, fp, pathname, stuff) @@ -227,8 +223,9 @@ class ModuleFinder: # But we must also collect Python extension modules - although # we cannot separate normal dlls from Python extensions. suffixes = [] - for triple in imp.get_suffixes(): - suffixes.append(triple[0]) + suffixes += importlib.machinery.EXTENSION_SUFFIXES[:] + suffixes += importlib.machinery.SOURCE_SUFFIXES[:] + suffixes += importlib.machinery.BYTECODE_SUFFIXES[:] for dir in m.__path__: try: names = os.listdir(dir) @@ -270,7 +267,8 @@ class ModuleFinder: try: m = self.load_module(fqname, fp, pathname, stuff) finally: - if fp: fp.close() + if fp: + fp.close() if parent: setattr(parent, partname, m) self.msgout(3, "import_module ->", m) @@ -289,7 +287,7 @@ class ModuleFinder: if fp.read(4) != imp.get_magic(): self.msgout(2, "raise ImportError: Bad magic number", pathname) raise ImportError("Bad magic number in %s" % pathname) - fp.read(4) + fp.read(8) # Skip mtime and size. co = marshal.load(fp) else: co = None @@ -334,30 +332,6 @@ class ModuleFinder: fullname = name + "." + sub self._add_badmodule(fullname, caller) - def scan_opcodes(self, co, - unpack = struct.unpack): - # Scan the code, and yield 'interesting' opcode combinations - # Version for Python 2.4 and older - code = co.co_code - names = co.co_names - consts = co.co_consts - while code: - c = code[0] - if c in STORE_OPS: - oparg, = unpack('<H', code[1:3]) - yield "store", (names[oparg],) - code = code[3:] - continue - if c == LOAD_CONST and code[3] == IMPORT_NAME: - oparg_1, oparg_2 = unpack('<xHxH', code[:6]) - yield "import", (consts[oparg_1], names[oparg_2]) - code = code[6:] - continue - if c >= HAVE_ARGUMENT: - code = code[3:] - else: - code = code[1:] - def scan_opcodes_25(self, co, unpack = struct.unpack): # Scan the code, and yield 'interesting' opcode combinations @@ -389,10 +363,7 @@ class ModuleFinder: def scan_code(self, co, m): code = co.co_code - if sys.version_info >= (2, 5): - scanner = self.scan_opcodes_25 - else: - scanner = self.scan_opcodes + scanner = self.scan_opcodes_25 for what, args in scanner(co): if what == "store": name, = args @@ -511,7 +482,7 @@ class ModuleFinder: # Print modules that may be missing, but then again, maybe not... if maybe: print() - print("Submodules thay appear to be missing, but could also be", end=' ') + print("Submodules that appear to be missing, but could also be", end=' ') print("global names in the parent package:") for name in maybe: mods = sorted(self.badmodules[name].keys()) @@ -662,4 +633,4 @@ if __name__ == '__main__': try: mf = test() except KeyboardInterrupt: - print("\n[interrupt]") + print("\n[interrupted]") |
