Boost Python - 用参数包装构造函数
Posted
技术标签:
【中文标题】Boost Python - 用参数包装构造函数【英文标题】:Boost Python - Wrapping constructor with arguments 【发布时间】:2019-06-14 17:33:02 【问题描述】:我已经设计了一个cpp
共享库,现在我想制作一个Python
包装器来使用它。一切正常,直到有必要更改 cpp
库构造函数,在其上添加一个参数。
我想知道如何在包装器中反映这个参数,因为下面的代码不再起作用了。我对代码进行了一些更改,现在就像下面这样。我几乎可以肯定问题出在这一行
py::class_<Wrapper>("Wrapper", py::init<>())
但我不知道如何在此处添加参数。我试过了
py::class_<Wrapper>("Wrapper", py::init<>(const std::string ¶m))
还有
py::class_<Wrapper>("Wrapper", py::init<const std::string ¶m>())
但都失败了。
EDIT在一些cmets之后,我决定使用(无参考)
py::class_<Wrapper>("Wrapper", py::init<const std::string param>())
但我仍然有同样的错误信息。
wrapper.hpp
#include "mycpplib.hpp"
#include <boost/python.hpp>
#include <boost/python/numpy.hpp>
#include <boost/python/dict.hpp>
namespace py = boost::python;
namespace np = boost::python::numpy;
class Wrapper
public:
// change: inclusion of the new parameter
Wrapper(const std::string ¶m);
py::dict function1();
;
wrapper.cpp
#include "wrapper.hpp"
namespace py = boost::python;
namespace np = boost::python::numpy;
// change: inclusion of the new parameter
Wrapper::Wrapper(
const std::string ¶m)
//do something
py::dict
Wrapper::function1()
//do something
BOOST_PYTHON_MODULE(libwrapper)
Py_Initialize();
np::initialize();
py::class_<Wrapper>("Wrapper", py::init<const std::string param1>())
.def("_function1", &Wrapper::function1)
;
wrapper.py
import libwrapper
class Wrapper(libwrapper.Wrapper):
# change: inclusion of the new parameter
def __init__(self, param):
libwrapper.Wrapper.__init__(self, param)
def function1(self):
return self._function1()
错误是:
/path/wrapper.cpp: In function 'void init_module_libwrapper()':
/path/wrapper.cpp:24:69: error: template argument 1 is invalid
py::class_<Wrapper>("Wrapper", py::init<const std::string param1>())
^
【问题讨论】:
旁注:如果您没有涉及 Boost,并且您正在编写新代码,I'd recommend going withpybind11
;构建更容易(因为pybind11
是一个仅头文件库,不涉及编译时间或构建时间库依赖项)并且它在绑定生成方面往往“更智能”(因为它是使用 C++11 类型构建的推理特征)。
@ShadowRanger 感谢您的建议,但现在不能更改它。我需要按原样解决问题。
字符串来自 python 并且 python 字符串是不可变的,所以你不能通过引用传递它们。请参阅here 了解可能的解决方案。
@doqtor 我对解决方案的可能性感到兴奋,但它也不起作用。错误仍然是error: template argument 1 is invalid py::class_<Wrapper>("Wrapper", py::init<const std::string param1>())
,但现在std::string &param1
中没有&
【参考方案1】:
阅读 boost 文档 (https://www.boost.org/doc/libs/1_68_0/libs/python/doc/html/tutorial/tutorial/exposing.html) 我发现:
py::class_<Wrapper>("Wrapper", py::init<const std::string param1>())
应该这样写:
py::class_<Wrapper>("Wrapper", py::init<const std::string>())
没有参数名称。只是类型
【讨论】:
以上是关于Boost Python - 用参数包装构造函数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 boost/python 向 python 公开 C++ 虚函数?