exec()无法使用unicode字符

Lim*_*err 12 python encoding

我试图从我的python代码中执行.py程序,但是非ASCII字符在打印和处理时表现异常。

module1.py:

test = "áéíóúabcdefgçë"

print(test)
Run Code Online (Sandbox Code Playgroud)

主要代码:

exec(open("module1.py").read(), globals())
Run Code Online (Sandbox Code Playgroud)

我要打印,áéíóúabcdefgçë但要打印áéíóúabcdefgçë。我尝试过的所有非ASCII字符都会发生这种情况。

我正在使用Python 3.7和Windows 10。

单独运行module1.py不会产生此错误,但是我想使用exec()或具有大致相同功能的其他东西来运行程序。

Hoo*_*oog 7

我找到了解决此问题的方法。Python open假设使用的编码不是UTF-8。将主代码更改为以下代码可以解决我的计算机(python 3.7和Windows 10)上的问题:

exec(open("module1.py", encoding="utf-8").read(),globals())
Run Code Online (Sandbox Code Playgroud)

感谢@jjramsey提供其他信息:

根据open()Python文档,“默认编码取决于平台(无论locale.getpreferredencoding()返回什么)。”

对我来说,如果我运行以下检查:

import locale
print(locale.getpreferredencoding())
Run Code Online (Sandbox Code Playgroud)

我得到cp1252,但不是UTF-8,因此open()会导致我们在此问题中看到的问题,除非我们指定编码。

  • @tgikal我忘了补充一点,我没有*不*将`module1.py`读成二进制文件(对我来说没有`“ rb”`)。另外,如果我使用“`encoding =“ cp1252”`“,则可以重现Limerr描述的问题。 (3认同)
  • exec(open(“ module1.py”,'rb')。read(),globals())也对我有用,我不确定标准的open python认为哪种编码。 (2认同)