将Python代码转字节码再转二进制并打印列表时遇属性错误
解决Python函数转字节码并输出二进制列表的问题
错误原因
dis.Bytecode(func)返回的是指令解析迭代器,每个元素是Instruction对象,并非原始字节码数据,因此没有size属性,也无法用len()获取长度。- 要获取函数编译后的原始字节码,需直接访问函数的
__code__.co_code属性,这是一个bytes对象,存储了函数的原始字节码。
修正后的代码
def func(): a = 10 b = 20 c = a + b print(c) # 获取函数的原始字节码(bytes类型) raw_bytecode = func.__code__.co_code # 将每个字节转为8位二进制字符串,存入列表 binary_list = [bin(b)[2:].zfill(8) for b in raw_bytecode] # 打印二进制列表 print(binary_list) # 可选:将二进制列表还原为原始字节码 # restored_bytecode = bytes(int(b, 2) for b in binary_list) # print(restored_bytecode)
代码说明
- 获取原始字节码:
func.__code__.co_code直接返回函数编译后的原始字节码,类型为bytes,每个元素是0-255的单字节整数。 - 转二进制列表:通过列表推导式遍历每个字节,
bin(b)[2:]去掉二进制前缀0b,zfill(8)补全为8位标准二进制字符串,保证每个字节的二进制格式统一。 - 原代码额外问题修正:原代码存在变量名错误(
list_code初始化后,循环中误用未定义的string_code),同时struct.pack属于冗余操作——co_code本身已是bytes类型,无需二次打包。
内容的提问来源于stack exchange,提问作者Howard Felix
相关产品推荐
相关产品推荐

