问题复述:
博主有个对外的c库,封成.a或.dll库文件以后对外开放,使用ctypes
实现对库文件的调用,最早发现①计算过程老是没结束的就异常退出,解决以后,现在又发现②不同的python版本调用库的计算结果不同,如Python3.8.10和Python3.8.19的运行结果完全不同。
解决方案:
-
问题①:计算过程没结束就异常退出
- 问题分析:当时为了最大程度的简化python的接口封装复杂度,在C中使用了一些全局变量,后来发现Python有个自动内存管理机制,每隔一段时间会自动释放掉这些内存,进而导致了异常退出的问题。
- 解决方案:将全局变量封装在某个结构体中,放在python中管理,通过传地址的方式传到算法中。
-
问题②:不同的python版本调用库的计算结果不同
- 问题分析:检查算法发现无全局变量的存在,排除了全局变量的问题,利用打印大法最终追踪到数据异常的地方,发现出问题的地方,C使用
malloc
申请了内存,所以应该是申请的内存还没用完,就被Python给释放掉了,修改成确定的数组后,发现问题解决。 - 解决方案:干掉
malloc
等方式的操作,直接使用确定的数组代替。
- 问题分析:检查算法发现无全局变量的存在,排除了全局变量的问题,利用打印大法最终追踪到数据异常的地方,发现出问题的地方,C使用
总结: Python封装接口时,务必要注意C语言中尽可能的避免掉全局变量
和内存操作
。
小声BB: 使用其他语言封装成python接口,是真坑🕳…