我们的应用程序通过Boost.Python提供python绑定。但是,许多API方法都使用第三方库定义的类型:一个示例是Eigen,另一个是Qt。
对于其中一些库,有时可以使用第三方绑定:对于Eigen,我发现minieigen;对于Qt,PySide2可用。
通常,如何在不为每种类型编写自己的转换器的情况下利用这些绑定?例如,考虑以下内容:
class Test
{
public:
static double test(const Eigen::Vector3d& vector)
{
return vector.norm(); //just an example
}
};
BOOST_PYTHON_MODULE(test)
{
using namespace boost::python;
scope classScope = class_<Test>("Test", no_init)
.def("test", &Test::test)
.staticmethod("test")
;
}
像这样包装,代码显然不起作用:
>>> from test import Test
>>> import minieigen
>>> Test.test(minieigen.Vector3(0, 1, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
Test.test(Vector3)
did not match C++ signature:
test(Eigen::Matrix<double, 3, 1, 0, 3, 1>)
我知道问题在于,Boost.Python运行时未获知minieigen包装的类型,因此我必须提供某种“胶水代码”。似乎Shiboken(用于PySide2)为此提供了一个API(this question对此进行了处理,但它仍然让我感到困惑)。但是,minieigen似乎没有这样的东西。
过去,我发现了一段很有前途的代码,作者可以通过该代码包装/解包PyObject的基础C ++指针,但是我无法再次找到它...
我希望通过类似的过程来节省包装程序中使用的每种第三方类型的工作。