有没有办法知道编译.pyc
文件的Python版本是什么?
答案 0 :(得分:50)
您可以按如下方式获取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版本。
答案 1 :(得分:49)
.pyc
文件的前两个字节是指示字节码版本的幻数。该单词以little-endian格式存储,已知值为:
# Python/import.c - merged by aix from Python 2.7.2 and Python 3.2.2
# EDIT: added little endian hex values for comparison first two bytes of Igor Popov's method -jimbob
Python 1.5: 20121 0x994e
Python 1.5.1: 20121 0x994e
Python 1.5.2: 20121 0x994e
Python 1.6: 50428 0x4cc4
Python 2.0: 50823 0x87c6
Python 2.0.1: 50823 0x87c6
Python 2.1: 60202 0x2aeb
Python 2.1.1: 60202 0x2aeb
Python 2.1.2: 60202 0x2aeb
Python 2.2: 60717 0x2ded
Python 2.3a0: 62011 0x3bf2
Python 2.3a0: 62021 0x45f2
Python 2.3a0: 62011 0x3bf2 (!)
Python 2.4a0: 62041 0x59f2
Python 2.4a3: 62051 0x63f2
Python 2.4b1: 62061 0x6df2
Python 2.5a0: 62071 0x77f2
Python 2.5a0: 62081 0x81f2 (ast-branch)
Python 2.5a0: 62091 0x8bf2 (with)
Python 2.5a0: 62092 0x8cf2 (changed WITH_CLEANUP opcode)
Python 2.5b3: 62101 0x95f2 (fix wrong code: for x, in ...)
Python 2.5b3: 62111 0x9ff2 (fix wrong code: x += yield)
Python 2.5c1: 62121 0xa9f2 (fix wrong lnotab with for loops and
storing constants that should have been removed)
Python 2.5c2: 62131 0xb3f2 (fix wrong code: for x, in ... in listcomp/genexp)
Python 2.6a0: 62151 0xc7f2 (peephole optimizations and STORE_MAP opcode)
Python 2.6a1: 62161 0xd1f2 (WITH_CLEANUP optimization)
Python 2.7a0: 62171 0xdbf2 (optimize list comprehensions/change LIST_APPEND)
Python 2.7a0: 62181 0xe5f2 (optimize conditional branches:
introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Python 2.7a0 62191 0xeff2 (introduce SETUP_WITH)
Python 2.7a0 62201 0xf9f2 (introduce BUILD_SET)
Python 2.7a0 62211 0x03f3 (introduce MAP_ADD and SET_ADD)
Python 3000: 3000 0xb80b
3010 0xc20b (removed UNARY_CONVERT)
3020 0xcc0b (added BUILD_SET)
3030 0xd60b (added keyword-only parameters)
3040 0xe00b (added signature annotations)
3050 0xea0b (print becomes a function)
3060 0xf40b (PEP 3115 metaclass syntax)
3061 0xf50b (string literals become unicode)
3071 0xff0b (PEP 3109 raise changes)
3081 0x090c (PEP 3137 make __file__ and __name__ unicode)
3091 0x130c (kill str8 interning)
3101 0x1d0c (merge from 2.6a0, see 62151)
3103 0x1f0c (__file__ points to source file)
Python 3.0a4: 3111 0x270c (WITH_CLEANUP optimization).
Python 3.0a5: 3131 0x3b0c (lexical exception stacking, including POP_EXCEPT)
Python 3.1a0: 3141 0x450c (optimize list, set and dict comprehensions:
change LIST_APPEND and SET_ADD, add MAP_ADD)
Python 3.1a0: 3151 0x4f0c (optimize conditional branches:
introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Python 3.2a0: 3160 0x580c (add SETUP_WITH)
tag: cpython-32
Python 3.2a1: 3170 0x620c (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
tag: cpython-32
Python 3.2a2 3180 0x6c0c (add DELETE_DEREF)
答案 2 :(得分:9)
或者,如果你有一个GNU / Linux系统,你可以在终端中使用命令“file”:
$ file code.pyc
> code.pyc: python 3.5.2 byte-compiled
答案 3 :(得分:2)
在Python中查看我的script,它检测并返回编译文件(* .pyc或* .pyo)的Python版本。
它可以检测从Python 1.5到最后一次Python 3构建的Python版本。
答案 4 :(得分:2)
官方Python github存储库似乎不再将该列表保留在import.c中。
当搜索比我在其他地方找到的更新的列表时,我在2017年5月遇到了Google最新的列表。
https://github.com/google/pytype/blob/master/pytype/pyc/magic.py
答案 5 :(得分:0)
添加到@Igor Popov 的回答中。
# written in python3
filename = "outfit.cpython-39.pyc"
with open(filename,'rb') as f:
magic = f.read(4)
print(int.from_bytes(magic[:2], 'little'))
您可以在此处查找输出编号: https://github.com/google/pytype/blob/master/pytype/pyc/magic.py