UnicodeEncodeError使用编译函数时

Windows 7中使用python 3.2我在IDLE中获取以下内容:

>>compile('pass', r'c:\temp\工具\module1.py', 'exec') UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character 

任何人都可以解释为什么编译语句试图使用mbcs转换unicode文件名? 我知道sys.getfilesystemencoding在Windows中返回'mbcs',但是我认为在提供unicode文件名时不会使用它。

例如:

 f = open(r'c:\temp\工具\module1.py') 

作品。

要进行更完整的testing,请将以下内容保存为utf8编码文件,并使用标准python.exe版本3.2运行

 # -*- coding: utf8 -*- fname = r'c:\temp\工具\module1.py' # I do have the a file named fname but you can comment out the following two lines f = open(fname) print('ok') cmp = compile('pass', fname, 'exec') print(cmp) 

输出:

 ok Traceback (most recent call last): File "module8.py", line 6, in <module> cmp = compile('pass', fname, 'exec') UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: inval id character 

Solutions Collecting From Web of "UnicodeEncodeError使用编译函数时"

从Python的问题10114 ,似乎逻辑是Python使用的所有文件名应该在使用它们的平台上有效。 它使用文件系统编码进行编码,用于Python的C内部。

我同意它可能不应该在Windows上引发错误,因为任何Unicode文件名都是有效的。 你可能希望用Python来提交一个错误报告。 但是请注意,必要的更改可能不是微不足道的,因为任何使用文件名的C代码在无法编码时都必须执行某些操作。

这里有一个解决方案,为我工作: 问题427:UnicodeEncodeError:'ascii'编解码器不能编码字符在位置1-6:序号不在范围(128) :

如果您在主题为“编码Python源文件”(最后一段)中查看PyScripter帮助文件,它会告诉您如何通过修改site.py文件来配置Python以支持其他编码。 该文件位于Python安装目录的lib子目录中。 找到函数setencoding并确保支持语言环境感知的默认字符串编码处于打开状态。 (见下文)

 def setencoding(): """Set the string encoding used by the Unicode implementation. The default is 'ascii', but if you're willing to experiment, you can change this.""" encoding = "ascii" # Default value set by _PyUnicode_Init() if 0: <<<--- set this to 1 --------------------------------- # Enable to support locale aware default string encodings. import locale loc = locale.getdefaultlocale () if loc[1]: encoding = loc[1] if 0: # Enable to switch off string to Unicode coercion and implicit # Unicode to string conversion. encoding = "undefined" if encoding != "ascii": # On Non-Unicode builds this will raise an AttributeError... sys.setdefaultencoding (encoding) # Needs Python Unicode build ! 

我想你可以尝试将文件路径中的“\”改成“/”,就像

编译('pass',r'c:\ temp \工具\ module1.py','exec')

编译('pass',r'c:/ temp /工具/module1.py','exec')

我遇到了和你一样的问题,我用这个方法来解决问题。 我希望它可以与你的工作。