将 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 回调中的主要内容,如果未能解决你的问题,请参考以下文章