1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
--- 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):
|