import io from contextlib import redirect_stdout from compileall import compile_file from tempfile import TemporaryDirectory from pathlib import Path with TemporaryDirectory() as tmpdir: invalid_python_file = Path(tmpdir, "script.py") invalid_python_file.write_text("invalid python code") # works on sys.stdout compile_file(invalid_python_file) # fails when redirected to io.StringIO # because io.StringIO.encoding is None with redirect_stdout(io.StringIO()): compile_file(invalid_python_file)