Python Marshal代码PC端报错ValueError,Pydroid3可正常运行求解决
解决marshal跨Python环境兼容问题:Pydroid 3可运行但PC端Python 3.10报错
问题描述
代码在Pydroid 3环境正常运行,但PC端Python 3.10执行时抛出错误:
ValueError: bad marshal data (unknown type code)
所有同类基于marshal的代码都存在该问题,需要实现PC端运行或解码这类代码的方案。
示例代码:
import marshal exec(marshal.loads(b'\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00@\x00\x00\x00s|\x00\x00\x00d\x00d\x01l\x00Z\x00d\x02Z\x01e\x02e\x01\x83\x01\x01\x00e\x03d\x03\x83\x01Z\x04e\x05e\x04\x83\x01\xa0\x06\xa1\x00Z\x07e\x08e\x07d\x04d\x05\x83\x03Z\te\x00\xa0\ne\t\xa1\x01Z\xbe\x05d\x06d\x07\x83\x02Z\xce\xc\xa0\rd\x08\xa1\x01\x01\x00e\xc\xa0\rd\te\xee\xb\x83\x01\x17\x00d\n\x17\x00\xa1\x01\x01\x00e\xc\xa0\xf\xa1\x00\x01\x00e\x02d\xb\x83\x01\x01\x00d\x01S\x00)\xc\xe9\x00\x00\x00\x00Nz\xe9\n\n ___ __ _ ___ __ _ ___ _ __ __ _ ___| | __\n / __/ _` |/ __/ _` |/ __| \'__/ _` |/ __| |/ /\n| (_| (_| | (_| (_| | (__| | | (_| | (__| <\n \\___\\__,_|\\___\\__,_|\\___|_| \\__,_|\\___|_|\\_|\n Youtube : CACACRACK\n Instagram: jeager000\n z\xfMasukan File : \\xda\\x00\\xda\\x04execz\\x08hasil.py\\xda\\x01wz\\xfimport marshal\nz\\x13exec(marshal.loads(z\\x02))z\"selesai, nama file kamu : hasil.py)\\x10\\xda\\x07marshal\\xda\\tcacacrack\\xda\\x05print\\xda\\x05input\\xda\\x03inp\\xda\\x04open\\xda\\x04read\\xda\\x04file\\xda\\x07compile\\xda\\x03com\\xda\\x05dumps\\xda\\x03dum\\xda\\x08file_out\\xda\\x05write\\xda\\x04repr\\xda\\x05close\\xa9\\x00r\\x15\\x00\\x00\\x00r\\x15\\x00\\x00\\x00r\\x02\\x00\\x00\\x00\\xda\\x08<module>\\x01\\x00\\x00\\x00s\\x16\\x00\\x00\\x00\\x08\\x02\\x04\\t\\x08\\x01\\x08\\x01\\x0c\\x01\\x0c\\x01\n\\x01\n\\x01\n\\x01\\x16\\x01\\x08\\x02'))
问题根源
marshal模块的序列化格式强绑定Python版本,不同大版本(甚至部分小版本)之间不保证兼容性。Pydroid 3使用的Python版本(通常是Android适配的旧版本,如3.8或更早)与PC端Python 3.10的marshal格式不匹配,导致3.10无法解析旧版本生成的marshal数据。
解决方案
1. 安装对应Python版本解析
- 先在Pydroid 3中运行
import sys; print(sys.version),确认其使用的Python版本。 - 在PC端安装完全相同的Python版本,用该版本运行代码即可正常解析marshal数据。
2. 在Pydroid中转存为跨版本兼容格式
如果无法安装旧版本Python,可在Pydroid中先解码marshal数据,再用跨版本兼容的方式保存后传到PC端:
import marshal import pickle # 替换为你的marshal数据 marshal_data = b'\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00@\x00\x00\x00s|\x00\x00\x00d\x00d\x01l\x00Z\x00d\x02Z\x01e\x02e\x01\x83\x01\x01\x00e\x03d\x03\x83\x01Z\x04e\x05e\x04\x83\x01\xa0\x06\xa1\x00Z\x07e\x08e\x07d\x04d\x05\x83\x03Z\te\x00\xa0\ne\t\xa1\x01Z\xbe\x05d\x06d\x07\x83\x02Z\xce\xc\xa0\rd\x08\xa1\x01\x01\x00e\xc\xa0\rd\te\xee\xb\x83\x01\x17\x00d\n\x17\x00\xa1\x01\x01\x00e\xc\xa0\xf\xa1\x00\x01\x00e\x02d\xb\x83\x01\x01\x00d\x01S\x00)\xc\xe9\x00\x00\x00\x00Nz\xe9\n\n ___ __ _ ___ __ _ ___ _ __ __ _ ___| | __\n / __/ _` |/ __/ _` |/ __| \'__/ _` |/ __| |/ /\n| (_| (_| | (_| (_| | (__| | | (_| | (__| <\n \\___\\__,_|\\___\\__,_|\\___|_| \\__,_|\\___|_|\\_|\n Youtube : CACACRACK\n Instagram: jeager000\n z\xfMasukan File : \\xda\\x00\\xda\\x04execz\\x08hasil.py\\xda\\x01wz\\xfimport marshal\nz\\x13exec(marshal.loads(z\\x02))z\"selesai, nama file kamu : hasil.py)\\x10\\xda\\x07marshal\\xda\\tcacacrack\\xda\\x05print\\xda\\x05input\\xda\\x03inp\\xda\\x04open\\xda\\x04read\\xda\\x04file\\xda\\x07compile\\xda\\x03com\\xda\\x05dumps\\xda\\x03dum\\xda\\x08file_out\\xda\\x05write\\xda\\x04repr\\xda\\x05close\\xa9\\x00r\\x15\\x00\\x00\\x00r\\x15\\x00\\x00\\x00r\\x02\\x00\\x00\\x00\\xda\\x08<module>\\x01\\x00\\x00\\x00s\\x16\\x00\\x00\\x00\\x08\\x02\\x04\\t\\x08\\x01\\x08\\x01\\x0c\\x01\\x0c\\x01\n\\x01\n\\x01\n\\x01\\x16\\x01\\x08\\x02')) # 解码得到代码对象 code_obj = marshal.loads(marshal_data) # 方式1:导出为源码字符串(需安装uncompyle6) # pip install uncompyle6 import uncompyle6 with open('source.py', 'w', encoding='utf-8') as f: uncompyle6.decompile(code_obj, f) # 方式2:用pickle序列化(兼容性优于marshal) with open('code.pkl', 'wb') as f: pickle.dump(code_obj, f)
- 导出的
source.py可直接在PC端Python 3.10运行。 - 若用pickle,PC端可运行
import pickle; exec(pickle.load(open('code.pkl', 'rb')))执行代码。
3. 反编译获取源码
直接用反编译工具把marshal数据转成可读源码,彻底摆脱版本限制:
- 在Pydroid中安装
uncompyle6:pip install uncompyle6 - 运行上述代码中的导出源码部分,生成
source.py后传到PC端直接使用。
内容的提问来源于stack exchange,提问作者Batuhan Bahadır
相关产品推荐
相关产品推荐

