将 python + numpy 代码嵌入到 C++ dll 回调中

Posted

技术标签:

【中文标题】将 python + numpy 代码嵌入到 C++ dll 回调中【英文标题】:Embedding python + numpy code into C++ dll callback 【发布时间】:2011-11-24 08:15:29 【问题描述】:

我是 python 嵌入的新手。 我正在尝试将 python + numpy 代码嵌入到 C++ 回调函数中(在 dll 中)

我面临的问题如下。如果我有:

Py_Initialize();
// some python glue
// python invocation
Py_Finalize();

一切正常。

但如果我有:

Py_Initialize();
_import_array(); //to initialize numpy C-API
// some python glue + numpy array object creation
// python invocation via PyObject_CallObject()
Py_Finalize();

这在第二次到达 _import_array() 时崩溃; (意味着它适用于第一个回调)

如果我只进行一次 python 和 numpy 初始化并在析构函数中完成(因此不是每次都初始化/完成),那么在离开回调时一切都会崩溃..

我猜这里的问题是 numpy,但我不知道如何解决它

【问题讨论】:

如果您可以完全控制 DLL 的构建方式,我会亲自将细节留给 distutils 和 swig。这是一个示例项目(与 numpy 交互):github.com/martinxyz/python/tree/master/realistic 【参考方案1】:

尝试确保您的 .dll 仅被初始化一次,无论代码实际被调用多少次。

这是一个关于“DLL 中的 C++ 单例”的链接:

Singleton in a DLL?

【讨论】:

嗨,保罗,感谢您的回答!所以,我很确定我的 dll 只初始化了一次,事实上,我没有说如果我在我的 dll 初始化时也初始化 python,并在析构函数中完成,这样的东西可以正常工作:PyRun_SimpleString(@ 987654324@ "from numpy import *\n" "print 'Today is',ctime(time())\n" ); 但是如果我尝试通过 PyObject_CallObject() 调用 python,那么它不再起作用,并且在回调终止时崩溃 嗨 - 1) 确保在程序执行期间只初始化 Python 一次(并且不初始化一次以上,否则永远不会)。 2)看上面贴的martinxyz示例代码,3)看这个线程——类似的问题,由引用计数错误引起:velocityreviews.com/forums/… 非常感谢保罗,这个链接帮了很多忙!实际上问题是 PyTuple_SetItem() 使用的对象的 DECREF。现在它似乎工作了,但我当然必须做一些更广泛的测试!再次感谢! 太棒了,我做到了if (!Py_IsInitialized()) ... initialize python interpreter ...

以上是关于将 python + numpy 代码嵌入到 C++ dll 回调中的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组从 C 传递到嵌入式 python 脚本

将 matplotlib 图表嵌入 Qt/C++ 应用程序

C++ - 使用 numpy 嵌入 Python

在 C++ Qt 应用程序中嵌入 Python/Numpy/Matplotlib?

在 MATLAB 中嵌入 Python

C 中的嵌入式 python:有没有办法从压缩的 python 存档中正确导入 numpy?