首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost Python中的跨模块依赖关系

Boost Python中的跨模块依赖关系
EN

Stack Overflow用户
提问于 2010-12-14 20:53:33
回答 3查看 2.4K关注 0票数 7

假设我有两个boost python模块,它们的定义如下。模块A:

代码语言:javascript
复制
class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    class_<SomeClass>("SomeClass");
}

和模块B:

代码语言:javascript
复制
class AnotherClass {
public:
    AnotherClass() {}
    ~AnotherClass() {}
    void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{   class_<AnotherClass>("AnotherClass")
        .def("func", &AnotherClass::func)
    ;
}

模块B依赖于模块A(即它使用模块A中的SomeClass )。现在,我执行以下python脚本:

代码语言:javascript
复制
import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)

我得到以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\bladiebla\script.py", line 8, in <module>
    obj2.func(obj1)
ArgumentError: Python argument types in
AnotherClass.func(AnotherClass, SomeClass)
did not match C++ signature:
func(class AnotherClass {lvalue}, class SomeClass)

看起来Python不会自动在模块之间转换类。有谁知道怎么解决这个问题吗?

EN

回答 3

Stack Overflow用户

发布于 2011-08-23 19:20:07

我最近刚开始摆弄Boost.Python,也遇到了同样的问题。

查看以下文档的第6节:

http://www.boost.org/doc/libs/1_47_0/libs/python/doc/building.html

6.1 -动态二进制

该库包含一个类型转换注册表。因为一个注册表在所有扩展模块之间共享,所以在一个动态加载的扩展模块中公开给Python类的实例可以传递给在另一个这样的模块中公开的函数。

我使用的是静态二进制文件,得到的错误类型和你得到的是一样的。一旦我切换到动态二进制文件,它就编译并运行得很好。

票数 7
EN

Stack Overflow用户

发布于 2010-12-15 00:32:05

根据您的最新回复和问题中更新的错误消息,我认为问题可能是因为您的BOOST_PYTHON_MODULE使用可能不正确(基于我在其他使用它的示例中看到的)。试着这样做,看看是否有帮助:

模块A:

代码语言:javascript
复制
class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    boost::python::class_<SomeClass>("SomeClass");
}

和模块B:

代码语言:javascript
复制
class AnotherClass {
public:
    AnotherClass() {}
    ~AnotherClass() {}
    void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{   boost::python::class_<AnotherClass>("AnotherClass")
        .def("func", &AnotherClass::func)
    ;
}

请注意,在两个BOOST_PYTHON_MODULE声明中的每个class_<...>语句中都插入了"boost::python::“前缀。

票数 0
EN

Stack Overflow用户

发布于 2021-09-18 08:32:04

我也有类似的问题,通过使用boost::python::import()函数从模块B导入模块A解决了这个问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4439361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档