uncompyle6反编译报错ValueError: bad marshal data <unknown type code>

本文讲述了作者如何解决将exe文件转换为py并修复pyc文件头的问题,通过对比struct文件发现并插入缺失的16字节,确保pyc文件正确反编译。

这问题困扰我一天!

        首先我的目的是把exe文件转换成py文件,在最后把pyc文件反编译为Py的时候报错:

         因为在把py打包成exe的时候,pyc文件前面的8个字节会被抹掉,所以反编译的时候需要加回来,pyc同目录struct文件前8个字节就是需要的内容。

        所以这里猜测是pyc文件加入的内容有误,百度开始也没找到办法,后来仔细对比struct文件和pyc文件发现原来相差了16个字节,所以复制struct前16个字节到pyc文件里面去就可以了。(这里的pyc文件是和exe同名的文件,并且没有后缀名,是我们把丢失的字节复制进去后加的后缀名)

 

 

 

 

你提到在使用 `typeof` 时遇到了报错: ``` ValueError: Cannot determine Numba type of <class 'xxx'> ``` 这说明你可能在使用 **Numba** 库的 `typeof` 函数(而不是 Python 内置的 `type()`)来查看变量类型,而 Numba 无法识别你传入的类型或对象。 --- ### 🔍 为什么会报错? Numba 的 `typeof` 函数用于在 **Numba 编译上下文**中获取变量的类型,主要用于调试和类型注解,但它**只支持 Numba 支持的类型**(如基本类型、数组、部分结构化类型等),**不支持任意自定义类**。 示例: ```python from numba import typeof class MyClass: pass obj = MyClass() print(typeof(obj)) # 报错ValueError: Cannot determine Numba type of <class 'MyClass'> ``` 📌 报错原因: - `MyClass` 是一个普通的 Python 类,不属于 Numba 支持的类型系统。 - Numba 无法推断自定义类的类型结构。 --- ### ✅ 正确做法 #### 1. 如果你想查看对象的类型(使用 Python 原生方式): ```python print(type(obj)) # 输出:"<class '__main__.MyClass'>" ``` #### 2. 如果你确实需要在 Numba 中使用自定义类型: Numba 默认不支持完整的 Python 类型,但你可以使用: - `@jitclass`:Numba 提供的装饰器,用于定义可以在 Numba 函数中使用的类。 示例: ```python from numba import jitclass, int32 spec = [('x', int32), ('y', int32)] # 定义类的字段和类型 @jitclass(spec) class MyJitClass: def __init__(self, x, y): self.x = x self.y = y obj = MyJitClass(1, 2) print(typeof(obj)) # 正常输出 Numba 类型 ``` --- ### 📌 小结 | 方法 | 是否支持自定义类 | 是否支持 Numba | 用途 | |------|------------------|----------------|------| | `type(obj)` | ✅ 是 | ❌ 否 | Python 原生类型检查 | | `typeof(obj)`(Numba) | ❌ 否(仅限支持类型) | ✅ 是 | Numba 调试类型 | | `@jitclass` | ✅ 可以定义兼容类 | ✅ 是 | 在 Numba 中使用类 | --- ### ❗ 建议 - 如果你不需要 Numba 加速,就使用 `type()` 或 `isinstance()`。 - 如果你希望在 Numba 中使用类,请使用 `@jitclass` 定义类。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值