用于解析、编辑和处理Python字节码(bytecode)的工具。A tool for parsing and processing Python bytecode object.
Project description
pycodeobject库是一个用于解析、编辑和处理Python字节码(bytecode)的工具。
PyCodeObject is a tool for parsing and processing Python bytecode object.
详细介绍
字节码的结构
众所周知, Python中的字节码(bytecode) 是一种数据类型, Python代码的编译结果就是bytecode对象。
bytecode对象可以由虚拟机加载后直接运行,而pyc文件就是bytecode在硬盘上的保存形式。 先通过一个示例, 分析什么是字节码:
.. code-block:: python
>>> import dis >>> def f(x):print('hello',x)>>> f.__code__ <code object f at 0x02B27498, file "<pyshell#2>", line 1> >>> f.__code__.co_code b't\x00d\x01|\x00\x83\x02\x01\x00d\x00S\x00' >>> dis.dis(f) 1 0 LOAD_GLOBAL 0 (print) 2 LOAD_CONST 1 ('hello') 4 LOAD_FAST 0 (x) 6 CALL_FUNCTION 2 8 POP_TOP 10 LOAD_CONST 0 (None) 12 RETURN_VALUE >>>
上述示例中f.__code__就是bytecode对象, f.__code__.co_code就是二进制的字节码, 通过dis模块可以反编译、分析这些二进制代码。
Python解释执行代码时, 会首先将原始的源代码翻译成bytecode形式, 再直接执行bytecode, 以提高性能。
(在 Python 3.8中, 增加了一个属性 co_posonlyargcount, 而Python 3.11的字节码有较大的改动)
详尽的说明参见Python官方文档 https://docs.python.org/zh-cn/3.7/library/dis.html 。
包装字节码
在python中, bytecode对象的属性是不可修改的。如:
.. code-block:: python
>>> def f():pass >>> f.__code__.co_code = b'' Traceback (most recent call last): ... ... AttributeError: readonly attribute
为了使bytecode对象更易用, 本项目中的Code类, 用于包装 (wrap)字节码对象。
下面的示例是从doctest中摘取的:
.. code-block:: python
>>> def f():print("Hello") >>> c=Code.fromfunc(f) # 或 c=Code(f.__code__) >>> c.co_consts (None, 'Hello') >>> c.co_consts=(None, 'Hello World!') >>> c.exec() Hello World! >>> >>> import os,pickle >>> temp=os.getenv('temp') >>> with open(os.path.join(temp,"temp.pkl"),'wb') as f: ... pickle.dump(c,f) ... >>> f=open(os.path.join(temp,"temp.pkl"),'rb') >>> pickle.load(f).to_func()() Hello World! >>> >>> c.to_pycfile(os.path.join(temp,"temppyc.pyc")) >>> sys.path.append(temp) >>> import temppyc Hello World! >>> Code.from_pycfile(os.path.join(temp,"temppyc.pyc")).exec() Hello World!
版本 VERSION
1.0.5 (更新: 增加了对3.10及以上版本的支持。)
本模块与pyobject库的关系
pycodeobject库最初是作者单独开发的项目。后来因pyobject库的开发,pycodeobject库被整合到了pyobject.code_模块中。现今的pyobject的Code类和本模块的Code类完全相同。
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.