我有一个DLL,它使用C/Python API嵌入Python解释器。如果调用一次DLL,它可以正常工作,但是如果调用两次DLL,代码就会崩溃,我的程序会捕获内存错误。 调用DLL的C代码很简单,对DLL函数的调用(调用Python解释器)只执行一次,如果第二次调用(在代码中)未被注释,则代码会破裂,并且只有在Python代码中调用“Numpy”时才会发生这种情况
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dll_simples.h>
int main() {
double in[] = { 4,2,5,4,2 };
double out[5] = {};
double a = 0;
double b = 0;
simuser(a,b,in,out);
//simuser(a, b, in, out); IF NOT COMMENTED -> ERROR
return 0;
}
我已经按照建议here在DLL中注释了Py_Finalize(),这篇文章here确认了Py_Finalize()文档中的“如果多次调用其初始化例程,则某些扩展可能无法正常工作;如果应用程序多次调用Py_Initialize()和Py_Finalize(),则可能会发生这种情况。”所以我想知道为什么会发生这种情况,以及除了在最后一次调用DLL时只调用一次“Py_Finalize()”之外,是否还有其他事情可以做
清单[Python 3.Docs]: ctypes - A foreign function library for Python
dll00.h:
dll00.c:
main00.c:
code00.py:
注释:
因此Py\u Initialize/Py\u Finalize对不适用于“引用计数”(每个Py\u Initialize调用都需要一个Py\u Finalize对)
在函数中调用Py\u Initialize/Py\u Finalize,似乎有点过分(如果函数被多次调用)。我将在.dll中执行两个包装函数并调用:
(C)计划的
输出:
相关问题 更多 >
编程相关推荐