Ram*_*gil 6 c++ python boost boost-python
我试图通过从python引用到C++类方法来进行简单的调用.
我的C++代码如下所示:
class Foo {
protected:
int _internalVal;
public:
Foo() : _internalVal(5){}
void getVal(int& val_io) {val_io = _internalVal;}
void getValDoesNothing(int val_io) {val_io = _internalVal;}
}
Run Code Online (Sandbox Code Playgroud)
我编译好的boost包装器代码是:
BOOST_PYTHON_MODULE(libBar) {
boost::python::class_<Foo>("Foo")
.def("getVal", &Foo::getVal)
.def("getValDoesNothing", &Foo::getValDoesNothing);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我进行以下python调用时:
In [1]: import libBar
In [2]: f = libBar.Foo()
In [3]: f
Out[3]: <libBar.Foo at 0x2b483c0>
In [4]: val = int()
In [5]: #next command is just to check function signature type
In [6]: f.getValDoesNothing(val)
In [7]: f.getVal(val)
---------------------------------------------------------------------------
ArgumentError Traceback (most recent call last)
<ipython-input-5-531e4cea97c2> in <module>()
----> 1 f.getVal(val)
ArgumentError: Python argument types in
Foo.getVal(Foo, int)
did not match C++ signature:
getVal(Foo {lvalue}, int {lvalue})
Run Code Online (Sandbox Code Playgroud)
我正在使用我无法控制的库,因此更改getVal以返回值不是一个选项.
有没有办法让最后一个Python命令工作?
我甚至会采取一个不会改变Python变量但仍然允许函数调用的修复程序.
你想要实现的是在Python中无效.整数是不可变的,所以你不能简单地调用一个函数,并希望它会改变它的内容.
由于您正在使用库而不是控制和更改getVal以返回值不是一个选项,您可以创建一个这样的包装器:
int getVal(Foo &foo) {
int val_io;
foo.getVal(val_io);
return val_io;
};
BOOST_PYTHON_MODULE(libBar) {
boost::python::def("getVal", getVal);
...
}
Run Code Online (Sandbox Code Playgroud)
然后以这种方式使用:
In [1]: import libBar
In [2]: f = libBar.Foo()
In [3]: f
Out[3]: <libBar.Foo at 0x2b483c0
In [3]: libBar.getVal(f)
Out[3]: 5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4003 次 |
| 最近记录: |