From 298bb967767d666fca8177f8c2352c2134490565 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 28 Feb 2014 10:44:45 -0500 Subject: [PATCH] Issue #20778: Fix modulefinder to work with bytecode-only modules. Bug filed and initial attempt at a patch by Bohuslav Kabrda. --- Lib/modulefinder.py | 2 +- Lib/test/test_modulefinder.py | 20 ++++++++++++++++++++ Misc/NEWS | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py index 82c7aed1d74..264b0f0bfd1 100644 --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -287,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 diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py index 53ea2321749..ed30d6fe3a4 100644 --- a/Lib/test/test_modulefinder.py +++ b/Lib/test/test_modulefinder.py @@ -1,5 +1,7 @@ import os import errno +import importlib.machinery +import py_compile import shutil import unittest import tempfile @@ -208,6 +210,14 @@ a/module.py from . import * """] +bytecode_test = [ + "a", + ["a"], + [], + [], + "" +] + def open_file(path): dirname = os.path.dirname(path) @@ -288,6 +298,16 @@ class ModuleFinderTest(unittest.TestCase): def test_relative_imports_4(self): self._do_test(relative_import_test_4) + def test_bytecode(self): + base_path = os.path.join(TEST_DIR, 'a') + source_path = base_path + importlib.machinery.SOURCE_SUFFIXES[0] + bytecode_path = base_path + importlib.machinery.BYTECODE_SUFFIXES[0] + with open_file(source_path) as file: + file.write('testing_modulefinder = True\n') + py_compile.compile(source_path, cfile=bytecode_path) + os.remove(source_path) + self._do_test(bytecode_test) + def test_main(): support.run_unittest(ModuleFinderTest) diff --git a/Misc/NEWS b/Misc/NEWS index 3b707839e2b..58b6c36b2ff 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,6 +29,8 @@ Core and Builtins Library ------- +- Issue #20778: Fix modulefinder to work with bytecode-only modules. + - Issue #20791: copy.copy() now doesn't make a copy when the input is a bytes object. Initial patch by Peter Otten.