【问题标题】:Embedding python + numpy code into C++ dll callback将 python + numpy 代码嵌入到 C++ dll 回调中
【发布时间】: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,但我不知道如何解决它

【问题讨论】:

标签: c++ python numpy python-c-api python-embedding


【解决方案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 ... }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 2016-03-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多