gpt4 book ai didi

c++ - 如何使用 boost::python 从 Python 类型中提取包装的 C++ 类型?

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:19 27 4
gpt4 key购买 nike

我已经使用 Py++ 包装了一个 C++ 类,并且一切都在 Python 中运行良好。我可以实例化c++类,调用方法等。

我现在正尝试将一些 Python 嵌入到 C++ 应用程序中。这在大多数情况下也能正常工作。我可以在 Python 模块上调用函数、获取返回值等。

我正在调用的 python 代码返回我包装的类之一:

import _myextension as myext
def run_script(arg):
my_cpp_class = myext.MyClass()
return my_cpp_class

我像这样从 C++ 调用这个函数:

// ... excluding error checking, ref counting, etc. for brevity ...
PyObject *pModule, *pFunc, *pArgs, *pReturnValue;

Py_Initialize();
pModule = PyImport_Import(PyString_FromString("cpp_interface"));
pFunc = PyObject_GetAttrString(pModule, "run_script");
pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, PyString_FromString("an arg"));


pReturnValue = PyObject_CallObject(pFunc, pArgs);

bp::extract< MyClass& > extractor(pReturnValue); // PROBLEM IS HERE
if (extractor.check()) { // This check is always false
MyClass& cls = extractor();
}

问题是提取器实际上从未将 PyObject* 提取/转换为 MyClass(即 extractor.check() 始终为 false)。

根据 the docs这是提取包装的 C++ 类的正确方法。

我已经尝试从 Python 函数返回基本数据类型(整数/ float /字典),并且所有这些都被正确提取。

有什么我想念的吗?是否有另一种获取数据并转换为 MyClass 的方法?

最佳答案

我发现了错误。我没有在我的主要可执行文件中链接我的绑定(bind),因为绑定(bind)是在一个单独的项目中编译的,该项目仅创建了 python 扩展。

我假设通过使用 pModule = PyImport_Import(PyString_FromString("cpp_interface")); 加载扩展,绑定(bind)也会被加载,但事实并非如此。

为了解决这个问题,我只是将包含我的 boost::python 绑定(bind)的文件(对我来说,只是 wrapper.cpp)添加到我的主项目并重新构建。

关于c++ - 如何使用 boost::python 从 Python 类型中提取包装的 C++ 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13635790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com