py_compile vs import中的编码

时间:2018-06-11 10:09:38

标签: python-2.7 encoding compilation python-import

当使用py_compile.compile编译具有非ASCII字符的python脚本时,它不会抱怨编码。但是当导入时会在python 2.7中提供

SyntaxError: Non-ASCII character '\xe2' in file

为什么会这样?什么是使用py_compile进行导入和编译之间的区别?

1 个答案:

答案 0 :(得分:0)

似乎Python提供了其词法分析器的两种变体,一种在Python本身解析文件时在内部使用,另一种通过例如__builtins__.compiletokenizer.generate_tokens。看起来,只有前一个检查非ASCII字符。它由Parser / tokenizer.c中的#ifdef PGEN控制。

我对为什么要这样做有一个很好的猜测:在Python 3中,.py文件中允许使用非ASCII字符,并将其解释为utf-8 IIRC。通过在词法分析器中静默允许UTF-8,2.7的tokenizer.generate_tokens()函数可以接受所有有效的Py3代码。