summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-07-30 17:12:05 (GMT)
committerGitHub <noreply@github.com>2021-07-30 17:12:05 (GMT)
commit0db6c143ae5f04d223fdb2c94b820f16714b0a09 (patch)
treec25d7cd28da2d1a7eadbb0aba3c25f202d6aaf49
parent6e6dc2517379289932c68fc986ee3994468374fc (diff)
downloadcpython-0db6c143ae5f04d223fdb2c94b820f16714b0a09.zip
cpython-0db6c143ae5f04d223fdb2c94b820f16714b0a09.tar.gz
cpython-0db6c143ae5f04d223fdb2c94b820f16714b0a09.tar.bz2
bpo-44666: Use default encoding as fallback for compile_file (GH-27236) (GH-27488)
When sys.stdout.encoding is None compile_file will fall back to sys.getdefaultencoding to encode/decode error messages. Co-authored-by: Stefan Hoelzl <stefan.hoelzl@posteo.de> Co-authored-by: Mickaël Schoentgen <contact@tiger-222.fr> (cherry picked from commit 80f07076294bc09a55ed76d9bbf307404eef25e6)
-rw-r--r--Lib/compileall.py5
-rw-r--r--Lib/test/test_compileall.py8
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS.d/next/Library/2021-07-21-10-43-22.bpo-44666.CEThkv.rst2
4 files changed, 13 insertions, 3 deletions
diff --git a/Lib/compileall.py b/Lib/compileall.py
index 61b4c5c..454465b 100644
--- a/Lib/compileall.py
+++ b/Lib/compileall.py
@@ -254,9 +254,8 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0,
else:
print('*** ', end='')
# escape non-printable characters in msg
- msg = err.msg.encode(sys.stdout.encoding,
- errors='backslashreplace')
- msg = msg.decode(sys.stdout.encoding)
+ encoding = sys.stdout.encoding or sys.getdefaultencoding()
+ msg = err.msg.encode(encoding, errors='backslashreplace').decode(encoding)
print(msg)
except (SyntaxError, UnicodeError, OSError) as e:
success = False
diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py
index 96a0f8f..4612953 100644
--- a/Lib/test/test_compileall.py
+++ b/Lib/test/test_compileall.py
@@ -169,6 +169,14 @@ class CompileallTestsBase:
compileall.compile_file(data_file)
self.assertFalse(os.path.exists(os.path.join(data_dir, '__pycache__')))
+
+ def test_compile_file_encoding_fallback(self):
+ # Bug 44666 reported that compile_file failed when sys.stdout.encoding is None
+ self.add_bad_source_file()
+ with contextlib.redirect_stdout(io.StringIO()):
+ self.assertFalse(compileall.compile_file(self.bad_source_path))
+
+
def test_optimize(self):
# make sure compiling with different optimization settings than the
# interpreter's creates the correct file names
diff --git a/Misc/ACKS b/Misc/ACKS
index b1bd33a..385d7ca 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -794,6 +794,7 @@ Fredrik Håård
Florian Höch
Oleg Höfling
Robert Hölzl
+Stefan Hölzl
Catalin Iacob
Mihai Ibanescu
Ali Ikinci
diff --git a/Misc/NEWS.d/next/Library/2021-07-21-10-43-22.bpo-44666.CEThkv.rst b/Misc/NEWS.d/next/Library/2021-07-21-10-43-22.bpo-44666.CEThkv.rst
new file mode 100644
index 0000000..ab2ef22
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-07-21-10-43-22.bpo-44666.CEThkv.rst
@@ -0,0 +1,2 @@
+Fixed issue in :func:`compileall.compile_file` when ``sys.stdout`` is redirected.
+Patch by Stefan Hölzl.