Boost Python中的跨模块依赖关系

7 投票
3 回答
2644 浏览
提问于 2025-04-16 08:31

假设我有两个用Boost Python写的模块,定义如下。模块A:

class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    class_<SomeClass>("SomeClass");
}

还有模块B:

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脚本:

import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)

结果出现了以下错误:

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并不会自动在模块之间转换类。有没有人知道该怎么解决这个问题?

3 个回答

-1

我之前也遇到过类似的问题,我是通过在模块B中使用 boost::python::import() 函数来导入模块A解决的。

0

根据你最新的回复和问题中更新的错误信息,我觉得问题可能出在你使用BOOST_PYTHON_MODULE的方式上(根据我看到的其他例子)。你可以试试下面的方式,看看是否能解决问题:

模块A:

class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    boost::python::class_<SomeClass>("SomeClass");
}

还有模块B:

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::”的前缀。

7

我最近开始尝试使用Boost.Python,也遇到了同样的问题。

可以看看下面文档的第6部分:

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

6.1 - 动态二进制文件

这个库里有一个类型转换的注册表。因为所有扩展模块共享同一个注册表,所以在一个动态加载的扩展模块中暴露给Python的类实例,可以传递给另一个模块中暴露的函数

我之前使用的是静态二进制文件,结果遇到了和你一样的错误。一旦我换成动态二进制文件,就顺利编译并运行了。

撰写回答