如何将Python代码编译为字节码并运行?实操报错求助
Python字节码生成与exec运行报错解决
问题场景
假设存在myfile.py文件,代码如下:
a = 6 b = 4 print(a+b)
想要将这段代码转换为字节码,尝试了以下代码:
source_code = '''a = 6 b = 4 print(a+b)''' compiled_code = compile(source_code, '<string>', 'exec') print(compiled_code.co_code)
运行后输出的字节码为:
b'\x97\x00d\x00Z\x00d\x01Z\x01\x02\x00e\x02e\x00e\x01z\x00\x00\x00\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00d\x02S\x00'
但使用exec()运行字节码时出现报错:
Traceback (most recent call last): File "c:\Users\Dimuth De Zoysa\Desktop\Python_projects\OBftestcode.py", line 2, in <module> exec(compiled_code.co_code) ValueError: source code string cannot contain null bytes
需要解决该报错问题。
解决方法
错误原因
compiled_code.co_code是Python字节码的原始字节序列,它不是可直接传给exec()的有效输入。exec()接受的是**compile()返回的编译后代码对象**,而非字节码字节串。直接传入字节串时,exec()会将其当作源代码字符串处理,而字节串中包含的空字节\x00不符合Python源代码格式,因此触发报错。
正确运行方式
直接将compile()生成的代码对象传入exec()即可正常运行:
source_code = '''a = 6 b = 4 print(a+b)''' compiled_code = compile(source_code, '<string>', 'exec') # 直接运行编译后的代码对象 exec(compiled_code)
字节码保存与加载(可选)
如果需要将字节码保存到文件,之后再加载运行,可以使用Python内置的marshal模块:
import marshal source_code = '''a = 6 b = 4 print(a+b)''' compiled_code = compile(source_code, '<string>', 'exec') # 将字节码写入文件 with open('bytecode.bin', 'wb') as f: marshal.dump(compiled_code, f) # 从文件加载并运行字节码 with open('bytecode.bin', 'rb') as f: loaded_code = marshal.load(f) exec(loaded_code)
内容的提问来源于stack exchange,提问作者Dimuth De Zoysa
相关产品推荐
相关产品推荐

