Issue #17177: stop using imp for compileall.

This commit is contained in:
Brett Cannon 2013-06-14 23:04:02 -04:00
parent 0b16b0d3f0
commit 7822e123c4
2 changed files with 29 additions and 32 deletions

View File

@ -13,7 +13,7 @@ See module py_compile for details of the actual byte-compilation.
import os import os
import sys import sys
import errno import errno
import imp import importlib.util
import py_compile import py_compile
import struct import struct
@ -91,17 +91,18 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=False,
cfile = fullname + ('c' if __debug__ else 'o') cfile = fullname + ('c' if __debug__ else 'o')
else: else:
if optimize >= 0: if optimize >= 0:
cfile = imp.cache_from_source(fullname, cfile = importlib.util.cache_from_source(
debug_override=not optimize) fullname, debug_override=not optimize)
else: else:
cfile = imp.cache_from_source(fullname) cfile = importlib.util.cache_from_source(fullname)
cache_dir = os.path.dirname(cfile) cache_dir = os.path.dirname(cfile)
head, tail = name[:-3], name[-3:] head, tail = name[:-3], name[-3:]
if tail == '.py': if tail == '.py':
if not force: if not force:
try: try:
mtime = int(os.stat(fullname).st_mtime) mtime = int(os.stat(fullname).st_mtime)
expect = struct.pack('<4sl', imp.get_magic(), mtime) expect = struct.pack('<4sl', importlib.util.MAGIC_NUMBER,
mtime)
with open(cfile, 'rb') as chandle: with open(cfile, 'rb') as chandle:
actual = chandle.read(8) actual = chandle.read(8)
if expect == actual: if expect == actual:

View File

@ -1,11 +1,12 @@
import sys import sys
import compileall import compileall
import imp import importlib.util
import os import os
import py_compile import py_compile
import shutil import shutil
import struct import struct
import subprocess import subprocess
import sys
import tempfile import tempfile
import time import time
import unittest import unittest
@ -18,11 +19,11 @@ class CompileallTests(unittest.TestCase):
def setUp(self): def setUp(self):
self.directory = tempfile.mkdtemp() self.directory = tempfile.mkdtemp()
self.source_path = os.path.join(self.directory, '_test.py') self.source_path = os.path.join(self.directory, '_test.py')
self.bc_path = imp.cache_from_source(self.source_path) self.bc_path = importlib.util.cache_from_source(self.source_path)
with open(self.source_path, 'w') as file: with open(self.source_path, 'w') as file:
file.write('x = 123\n') file.write('x = 123\n')
self.source_path2 = os.path.join(self.directory, '_test2.py') self.source_path2 = os.path.join(self.directory, '_test2.py')
self.bc_path2 = imp.cache_from_source(self.source_path2) self.bc_path2 = importlib.util.cache_from_source(self.source_path2)
shutil.copyfile(self.source_path, self.source_path2) shutil.copyfile(self.source_path, self.source_path2)
self.subdirectory = os.path.join(self.directory, '_subdir') self.subdirectory = os.path.join(self.directory, '_subdir')
os.mkdir(self.subdirectory) os.mkdir(self.subdirectory)
@ -36,7 +37,7 @@ class CompileallTests(unittest.TestCase):
with open(self.bc_path, 'rb') as file: with open(self.bc_path, 'rb') as file:
data = file.read(8) data = file.read(8)
mtime = int(os.stat(self.source_path).st_mtime) mtime = int(os.stat(self.source_path).st_mtime)
compare = struct.pack('<4sl', imp.get_magic(), mtime) compare = struct.pack('<4sl', importlib.util.MAGIC_NUMBER, mtime)
return data, compare return data, compare
def recreation_check(self, metadata): def recreation_check(self, metadata):
@ -57,7 +58,8 @@ class CompileallTests(unittest.TestCase):
def test_mtime(self): def test_mtime(self):
# Test a change in mtime leads to a new .pyc. # Test a change in mtime leads to a new .pyc.
self.recreation_check(struct.pack('<4sl', imp.get_magic(), 1)) self.recreation_check(struct.pack('<4sl', importlib.util.MAGIC_NUMBER,
1))
def test_magic_number(self): def test_magic_number(self):
# Test a change in mtime leads to a new .pyc. # Test a change in mtime leads to a new .pyc.
@ -97,14 +99,14 @@ class CompileallTests(unittest.TestCase):
# interpreter's creates the correct file names # interpreter's creates the correct file names
optimize = 1 if __debug__ else 0 optimize = 1 if __debug__ else 0
compileall.compile_dir(self.directory, quiet=True, optimize=optimize) compileall.compile_dir(self.directory, quiet=True, optimize=optimize)
cached = imp.cache_from_source(self.source_path, cached = importlib.util.cache_from_source(self.source_path,
debug_override=not optimize) debug_override=not optimize)
self.assertTrue(os.path.isfile(cached)) self.assertTrue(os.path.isfile(cached))
cached2 = imp.cache_from_source(self.source_path2, cached2 = importlib.util.cache_from_source(self.source_path2,
debug_override=not optimize) debug_override=not optimize)
self.assertTrue(os.path.isfile(cached2)) self.assertTrue(os.path.isfile(cached2))
cached3 = imp.cache_from_source(self.source_path3, cached3 = importlib.util.cache_from_source(self.source_path3,
debug_override=not optimize) debug_override=not optimize)
self.assertTrue(os.path.isfile(cached3)) self.assertTrue(os.path.isfile(cached3))
@ -152,10 +154,12 @@ class CommandLineTests(unittest.TestCase):
return rc, out, err return rc, out, err
def assertCompiled(self, fn): def assertCompiled(self, fn):
self.assertTrue(os.path.exists(imp.cache_from_source(fn))) path = importlib.util.cache_from_source(fn)
self.assertTrue(os.path.exists(path))
def assertNotCompiled(self, fn): def assertNotCompiled(self, fn):
self.assertFalse(os.path.exists(imp.cache_from_source(fn))) path = importlib.util.cache_from_source(fn)
self.assertFalse(os.path.exists(path))
def setUp(self): def setUp(self):
self.addCleanup(self._cleanup) self.addCleanup(self._cleanup)
@ -190,8 +194,8 @@ class CommandLineTests(unittest.TestCase):
['-m', 'compileall', '-q', self.pkgdir])) ['-m', 'compileall', '-q', self.pkgdir]))
# Verify the __pycache__ directory contents. # Verify the __pycache__ directory contents.
self.assertTrue(os.path.exists(self.pkgdir_cachedir)) self.assertTrue(os.path.exists(self.pkgdir_cachedir))
expected = sorted(base.format(imp.get_tag(), ext) for base in expected = sorted(base.format(sys.implementation.cache_tag, ext)
('__init__.{}.{}', 'bar.{}.{}')) for base in ('__init__.{}.{}', 'bar.{}.{}'))
self.assertEqual(sorted(os.listdir(self.pkgdir_cachedir)), expected) self.assertEqual(sorted(os.listdir(self.pkgdir_cachedir)), expected)
# Make sure there are no .pyc files in the source directory. # Make sure there are no .pyc files in the source directory.
self.assertFalse([fn for fn in os.listdir(self.pkgdir) self.assertFalse([fn for fn in os.listdir(self.pkgdir)
@ -224,7 +228,7 @@ class CommandLineTests(unittest.TestCase):
def test_force(self): def test_force(self):
self.assertRunOK('-q', self.pkgdir) self.assertRunOK('-q', self.pkgdir)
pycpath = imp.cache_from_source(self.barfn) pycpath = importlib.util.cache_from_source(self.barfn)
# set atime/mtime backward to avoid file timestamp resolution issues # set atime/mtime backward to avoid file timestamp resolution issues
os.utime(pycpath, (time.time()-60,)*2) os.utime(pycpath, (time.time()-60,)*2)
mtime = os.stat(pycpath).st_mtime mtime = os.stat(pycpath).st_mtime
@ -288,7 +292,7 @@ class CommandLineTests(unittest.TestCase):
bazfn = script_helper.make_script(self.pkgdir, 'baz', 'raise Exception') bazfn = script_helper.make_script(self.pkgdir, 'baz', 'raise Exception')
self.assertRunOK('-q', '-d', 'dinsdale', self.pkgdir) self.assertRunOK('-q', '-d', 'dinsdale', self.pkgdir)
fn = script_helper.make_script(self.pkgdir, 'bing', 'import baz') fn = script_helper.make_script(self.pkgdir, 'bing', 'import baz')
pyc = imp.cache_from_source(bazfn) pyc = importlib.util.cache_from_source(bazfn)
os.rename(pyc, os.path.join(self.pkgdir, 'baz.pyc')) os.rename(pyc, os.path.join(self.pkgdir, 'baz.pyc'))
os.remove(bazfn) os.remove(bazfn)
rc, out, err = script_helper.assert_python_failure(fn) rc, out, err = script_helper.assert_python_failure(fn)
@ -299,7 +303,7 @@ class CommandLineTests(unittest.TestCase):
'-i', os.path.join(self.directory, 'nosuchfile'), self.pkgdir) '-i', os.path.join(self.directory, 'nosuchfile'), self.pkgdir)
self.assertRegex(out, b'rror.*nosuchfile') self.assertRegex(out, b'rror.*nosuchfile')
self.assertNotRegex(err, b'Traceback') self.assertNotRegex(err, b'Traceback')
self.assertFalse(os.path.exists(imp.cache_from_source( self.assertFalse(os.path.exists(importlib.util.cache_from_source(
self.pkgdir_cachedir))) self.pkgdir_cachedir)))
def test_include_file_with_arg(self): def test_include_file_with_arg(self):
@ -356,13 +360,5 @@ class CommandLineTests(unittest.TestCase):
self.assertRegex(out, b"Can't list 'badfilename'") self.assertRegex(out, b"Can't list 'badfilename'")
def test_main():
support.run_unittest(
CommandLineTests,
CompileallTests,
EncodingTest,
)
if __name__ == "__main__": if __name__ == "__main__":
test_main() unittest.main()