7

假设我有两个定义如下的 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(即它使用SomeClass来自模块 A)。现在,我执行以下 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 不会自动在模块之间转换类。有谁知道如何解决这个问题?

4

3 回答 3

7

我最近才开始摆弄 Boost.Python 并且遇到了同样的问题。

查看以下文档的第 6 节:

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

6.1 - 动态二进制

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

我使用的是静态二进制文件并得到了与您相同类型的错误。一旦我更改为动态二进制文件,它就会编译并运行良好。

于 2011-08-23T11:20:07.000 回答
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::”前缀。class_<...>BOOST_PYTHON_MODULE

于 2010-12-14T16:32:04.747 回答
-1

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

于 2021-09-18T08:32:03.680 回答