语法错误:文件 modules/commands.pyc 中存在非ASCII字符“\xd1”。

4

我有一个Python文件,[工作目录/]modules/commands.py,它只包含以下内容:

def getId():
    return "commands"

然后我有另一个文件,[工作目录/]main.py,其中使用了以下内容:

fpath = "modules/commands.py"
mname = "commands"
imp.load_source(mname, fpath)

commands.py中添加了getId()函数后,尝试运行main.py时出现以下错误:SyntaxError: Non-ASCII character '\xd1' in file modules/commands.pyc on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details。该错误提示存在非ascii字符,但文件中并没有这样的字符。是什么导致了这个错误?暂时可以通过删除.pyc文件解决问题,但下次运行时问题会再次出现。

2
help(imp)说“未记录的函数已过时”,而load_source未被记录。有没有不使用记录的load_module函数的原因?根据错误,似乎load_source正在加载编译(.pyc)文件,就好像它是源代码一样,但由于它没有被记录,这只是一个猜测。 - torek
对我来说运行良好!也许尝试删除[working dir/]modules/__pycache__ - rnbguy
有趣的是,load_source似乎有一定的流行度。用谷歌搜索"load_module example",第二个链接看起来很有希望:如何根据完整路径导入一个模块?(stackoverflow)。关于load_source的多个回答获得了比提到load_module的单个回答多100倍的赞同数。 - varesa
1
相关的,提到了load_source的弃用:https://dev59.com/22kv5IYBdhLWcg3wiRMJ - torek
使用hexedit来检查代码是否真的是您所认为的。有些编辑器可能会有时插入您看不到但会破坏代码的非打印字符。 - Jan Matějka
显示剩余5条评论
1个回答

3
由于似乎没有人想要这个问题的答案,我将自己写一个。
从imp模块中的load_source()方法已被标记为过时,并且在Python 3.X文档中甚至完全删除。
解决方法是改用imp模块中的find_module()和load_module()方法。更改后它开始无缝地工作。
过时的函数在行为上似乎有些错误(至少在Centos 6上的Python 2.6.6中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接