尝试导入.py文件时出现"Bad magic number"错误

12

我在尝试导入一些模块(编译的 .pyc 文件)时遇到了一些问题。我知道它是使用 Python 2.6.6(r266:84297)编译的,我已经安装了相同版本,但在尝试导入时出现了 "bad magic number" 错误 :(

有人知道我做错了什么吗? 或者 .pyc 模块中的魔数是否可以更改?


1
请查看https://dev59.com/uHRB5IYBdhLWcg3wyqAd?rq=1 - Matthew Adams
我没有 .py 文件来重新编译它。我只有 .pyc 文件,但不知道为什么 Python 无法导入它。版本是相同的。 - user1641423
我发现这个文件是 .pyo 格式(第一次发现没有扩展名)。.pyo 和 .pyc 文件有什么不同吗?还是它们是相同的? - user1641423
1
.pyc.pyo非常相似。它们都是Python代码的版本,已经进行了“字节编译”,以便在导入其他Python程序的模块时加载更快。.pyo基本上是.pyc的稍微优化版本。(有关更多详细信息,请参见文档。) - Matthew Adams
3个回答

8

正如Matthew提供的链接所述,你遇到的问题很可能是由于编译和加载模块时使用了不同版本的Python。你可以这样确定魔数:

with open('pyuca.pyc', 'rb') as f:
    print struct.unpack('<H', f.read(2))

通过打印sys.version(也可以在交互式启动时显示)来确定你的Python版本。如果使用的是Python 2.6.6,则魔数应该是62161。如果不同,则需要切换到另一个Python才能导入模块。

对于.pyo文件,同样适用。


有趣的事情。我需要导入的.pyc文件有一个魔数:C0 00 00 00。它是从使用pyInstaller打包的.exe文件中运行的。Python版本为2.6.6(DLL)。也许PyInstaller改变了.pyc的魔数和可能的结构? - user1641423
1
这些是十六进制字节吗?如果是,你是怎么获取它们的?那看起来不像是有效的Python魔数,这可能是Python拒绝导入文件的原因。 - user4815162342
1
这是.pyc文件的前4个字节。我知道它看起来很奇怪。现在我需要观察pyInstaler源代码,也许它会在程序启动时对魔数和其他东西进行修正。 - user1641423

3
我通过运行解决了这个问题。
find . -name '*.pyc' -exec rm {} +

我删除了目录中的所有pyc文件,之后一切都正常了。


2
find . -name '*.pyc' -delete - medecau

0
如果你同时在运行Python2和Python3,而删除旧的*.pyc文件过于混乱,那么你可以尝试添加以下内容来尝试修复这个Python3 bug,通过调整字节码文件的代码加载器后缀。
import sys
if(sys.version_info.major>=3): # switch byte files end extension on 3
    import importlib.machinery
    altsuffix = ['.pyc3'] # or some other ending that doesn't create conflicts
    importlib.machinery.BYTECODE_SUFFIXES = altsuffix

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