diff options
author | Gregory P. Smith <greg@krypto.org> | 2020-03-01 18:42:56 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-01 18:42:56 (GMT) |
commit | ce720d3e0674d6ac6f1b950c20a89be4cfde7853 (patch) | |
tree | 54dba81e8458c72a3e65886d69d688c9ed07b044 /Lib/test/test_importlib/util.py | |
parent | fec6681f7ae3e8867bd0446aa993a0b5f23045f9 (diff) | |
download | cpython-ce720d3e0674d6ac6f1b950c20a89be4cfde7853.zip cpython-ce720d3e0674d6ac6f1b950c20a89be4cfde7853.tar.gz cpython-ce720d3e0674d6ac6f1b950c20a89be4cfde7853.tar.bz2 |
bpo-39769: Fix compileall ddir for subpkgs. (GH-18676) (GH-18718)
Fix compileall.compile_dir() ddir= behavior on sub-packages.
Fixes compileall.compile_dir's ddir parameter and compileall command
line flag `-d` to no longer write the wrong pathname to the generated
pyc file for submodules beneath the root of the directory tree being
compiled. This fixes a regression introduced with Python 3.5.
Tests backported from GH 02673352b5db6ca4d3dc804965facbedfe66425d, the
implementation is different due to intervening code changes. But still
quiet simple.
Why was the bug ever introduced? The refactoring to add parallel
execution kept the ddir -> dfile computations but discarded the results
instead of sending them to compile_file(). This fixes that. Lack of tests
meant this went unnoticed.
Diffstat (limited to 'Lib/test/test_importlib/util.py')
-rw-r--r-- | Lib/test/test_importlib/util.py | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py index e016ea4..e6a1476 100644 --- a/Lib/test/test_importlib/util.py +++ b/Lib/test/test_importlib/util.py @@ -7,6 +7,7 @@ import importlib from importlib import machinery, util, invalidate_caches from importlib.abc import ResourceReader import io +import marshal import os import os.path from pathlib import Path, PurePath @@ -118,6 +119,16 @@ def submodule(parent, name, pkg_dir, content=''): return '{}.{}'.format(parent, name), path +def _get_code_from_pyc(pyc_path): + """Reads a pyc file and returns the unmarshalled code object within. + + No header validation is performed. + """ + with open(pyc_path, 'rb') as pyc_f: + pyc_f.seek(16) + return marshal.load(pyc_f) + + @contextlib.contextmanager def uncache(*names): """Uncache a module from sys.modules. |