有没有办法知道 .pyc 文件是用哪个 Python 版本编译的?

新手上路,请多包涵

有没有办法知道 .pyc 文件是用哪个 Python 版本编译的?

原文由 Aamir Rind 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 944
2 个回答

您可以按如下方式获取 Python 的幻数:

 $ python -V
Python 2.6.2
# python
>>> import imp
>>> imp.get_magic().encode('hex')
'd1f20d0a'

要获取 pyc 文件的幻数,您可以执行以下操作:

 >>> f = open('test25.pyc')
>>> magic = f.read(4)
>>> magic.encode('hex')
'b3f20d0a'
>>> f = open('test26.pyc')
>>> magic = f.read(4)
>>> magic.encode('hex')
'd1f20d0a'

通过比较幻数,您将知道生成 pyc 文件的 python 版本。

原文由 Igor Popov 发布,翻译遵循 CC BY-SA 3.0 许可协议

.pyc 文件的前两个字节是告诉字节码版本的幻数。该词以小端格式存储,已知值为:

蟒蛇版本十进制十六进制评论Python 1.5 20121 0x994e Python 1.5.1 20121 0x994e Python 1.5.2 20121 0x994e Python 1.6 50428 0x4cc4蟒蛇2.0 50823 0x87c6蟒蛇2.0.1 50823 0x87c6蟒蛇 2.1 60202 0x2aeb蟒蛇 2.1.1 60202 0x2aeb蟒蛇 2.1.2 60202 0x2aeb蟒蛇2.2 60717 0x2ded蟒蛇 2.3a0 62011 0x3bf2蟒蛇 2.3a0 62021 0x45f2蟒蛇 2.3a0 62011 0x3bf2 !蟒蛇 2.4a0 62041 0x59f2蟒蛇 2.4a3 62051 0x63f2蟒蛇 2.4b1 62061 0x6df2蟒蛇 2.5a0 62071 0x77f2蟒蛇 2.5a0 62081 0x81f2 ast分支蟒蛇 2.5a0 62091 0x8bf2with蟒蛇 2.5a0 62092 0x8cf2改变了 WITH_CLEANUP 操作码蟒蛇 2.5b3 62101 0x95f2修复错误代码: for x, in ...蟒蛇 2.5b3 62111 0x9ff2修复错误代码: x += yield蟒蛇 2.5c1 62121 0xa9f2使用 for 循环修复错误的 lnotab 并存储本应删除的常量蟒蛇 2.5c2 62131 0xb3f2修正错误的代码: for x, in ... 在listcomp/genexp蟒蛇 2.6a0 62151 0xc7f2窥孔优化和 STORE_MAP 操作码蟒蛇 2.6a1 62161 0xd1f2WITH_CLEANUP 优化蟒蛇 2.7a0 62171 0xdbf2优化列表理解/更改 LIST_APPEND蟒蛇 2.7a0 62181 0xe5f2优化条件分支:引入 POP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE蟒蛇 2.7a0 62191 0xeff2介绍 SETUP_WITH蟒蛇 2.7a0 62201 0xf9f2介绍 BUILD_SET蟒蛇 2.7a0 62211 0x03f3介绍 MAP_ADDSET_ADD蟒蛇 3000 3000 0xb80b 3010 0xc20b删除 UNARY_CONVERT 3020 0xcc0b添加了 BUILD_SET 3030 0xd60b添加了仅关键字参数3040 0xe00b添加签名注释3050 0xea0bprint 成为一个函数3060 0xf40b PEP 3115 元类语法3061 0xf50b字符串文字变成 unicode 3071 0xff0b PEP 3109 引发变化3081 0x090c PEP 3137 制作 __file____name__ unicode 3091 0x130c杀死 str8 实习生3101 0x1d0c从 2.6a0 合并,参见 62151 3103 0x1f0c__file__ 指向源文件Python 3.0a4 3111 0x270cWITH_CLEANUP 优化Python 3.0a5 3131 0x3b0c词法异常堆栈,包括 POP_EXCEPT蟒蛇 3.1a0 3141 0x450c优化列表、集合和字典理解:更改 LIST_APPENDSET_ADD ,添加 MAP_ADD蟒蛇 3.1a0 3151 0x4f0c优化条件分支:引入 POP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE蟒蛇 3.2a0 3160 0x580c添加 SETUP_WITH ,标签:cpython-32蟒蛇 3.2a1 3170 0x620c添加 DUP_TOP_TWO ,删除 DUP_TOPXROT_FOUR ,标签:cpython-32蟒蛇 3.2a2 3180 0x6c0c添加 DELETE_DEREF

资料来源:

  • Python/import.c - 由 aix 从 Python 2.7.2 和 Python 3.2.2 合并
  • 用于比较 jimbob 添加的 Igor Popov 方法的前两个字节的小端十六进制值

原文由 NPE 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题