假设我有两个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不会自动在模块之间翻译类。有人知道如何解决这个问题吗?

没有正确的解决方案

其他提示

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

查看以下文档的第6节:

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

6.1-动态二进制

该库包含类型转换注册表。 因为一个注册表在所有扩展模块之间共享.

我正在使用静态二进制,并获得了您遇到的错误类型。一旦我更改为动态二进制,它就会编译并运行正常。

根据您的问题中的最新答复和更新的错误消息,我认为问题可能是因为您 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 声明。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top