From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Fri, 30 Jul 2021 17:12:29 +0000 (-0700) Subject: bpo-44666: Use default encoding as fallback for compile_file (GH-27236) (GH-27489) X-Git-Tag: v3.9.7~100 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=73240d425b770c26d9424665259cd9a2f339b626;p=thirdparty%2FPython%2Fcpython.git bpo-44666: Use default encoding as fallback for compile_file (GH-27236) (GH-27489) When sys.stdout.encoding is None compile_file will fall back to sys.getdefaultencoding to encode/decode error messages. Co-authored-by: Stefan Hoelzl Co-authored-by: Mickaël Schoentgen (cherry picked from commit 80f07076294bc09a55ed76d9bbf307404eef25e6) --- diff --git a/Lib/compileall.py b/Lib/compileall.py index fe7f450c55e1..33fb76c54154 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -252,9 +252,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 3bbc6817f8d5..8df705666c09 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -164,6 +164,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 f01cc5d970bb..fc5602d39b65 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -781,6 +781,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 000000000000..ab2ef22d0c45 --- /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.