--- Lib/distutils/tests/test_build_py.py +++ Lib/distutils/tests/test_build_py.py @@ -92,6 +92,25 @@ os.chdir(cwd) sys.stdout = sys.__stdout__ + def test_dont_write_bytecode(self): + # makes sure byte_compile is not used + pkg_dir, dist = self.create_dist() + cmd = build_py(dist) + cmd.compile = 1 + cmd.optimize = 1 + + old_dont_write_bytecode = os.environ.get("PYTHONDONTWRITEBYTECODE") + os.environ["PYTHONDONTWRITEBYTECODE"] = "1" + try: + cmd.byte_compile([]) + finally: + if old_dont_write_bytecode is None: + del os.environ["PYTHONDONTWRITEBYTECODE"] + else: + os.environ["PYTHONDONTWRITEBYTECODE"] = old_dont_write_bytecode + + self.assertTrue('byte-compiling is disabled' in self.logs[0][1]) + def test_suite(): return unittest.makeSuite(BuildPyTestCase) --- Lib/distutils/util.py +++ Lib/distutils/util.py @@ -11,6 +11,7 @@ from distutils.dep_util import newer from distutils.spawn import spawn from distutils import log +from distutils.errors import DistutilsByteCompileError def get_platform (): """Return a string that identifies the current platform. This is used @@ -397,6 +398,9 @@ generated in indirect mode; unless you know what you're doing, leave it set to None. """ + # nothing is done if PYTHONDONTWRITEBYTECODE environment variable is set + if os.environ.get("PYTHONDONTWRITEBYTECODE") is not None: + raise DistutilsByteCompileError('byte-compiling is disabled.') # First, if the caller didn't force us into direct or indirect mode, # figure out which mode we should be in. We take a conservative --- Lib/distutils/command/build_py.py +++ Lib/distutils/command/build_py.py @@ -418,6 +418,10 @@ def byte_compile (self, files): + if os.environ.get("PYTHONDONTWRITEBYTECODE") is not None: + self.warn('byte-compiling is disabled, skipping.') + return + from distutils.util import byte_compile prefix = self.build_lib if prefix[-1] != os.sep: --- Lib/distutils/command/install_lib.py +++ Lib/distutils/command/install_lib.py @@ -121,6 +121,10 @@ return outfiles def byte_compile (self, files): + if os.environ.get("PYTHONDONTWRITEBYTECODE") is not None: + self.warn('byte-compiling is disabled, skipping.') + return + from distutils.util import byte_compile # Get the "--root" directory supplied to the "install" command, --- Lib/distutils/errors.py +++ Lib/distutils/errors.py @@ -76,6 +76,8 @@ class DistutilsTemplateError (DistutilsError): """Syntax error in a file list template.""" +class DistutilsByteCompileError(DistutilsError): + """Byte compile error.""" # Exception classes used by the CCompiler implementation classes class CCompilerError (Exception):