boost python单步调试_Boost Python学习笔记(三)

本文介绍了如何使用Boost Python在C++中调用Python代码,涉及基础类型、类实例和标准库(如list、dict、tuple)的交互,并通过示例演示了参数传递和类型检查的操作。
摘要由CSDN通过智能技术生成

你将学到什么

在C++中调用Python代码时的传参问题

基础类型

继续使用前面的项目,但是先修改下Python脚本(zoo.py),添加Add和Str函数,分别针对整数、浮点数和字符串参数的测试

def Add(x, y):

print(x + y)

def Str(s):

print("Output: " + s)

if __name__ == '__main__':

pass

然后修改下main.cpp源文件

#include

#include

#include "boost_wrapper.h"

using namespace boost::python;

using namespace boost::python::detail;

int main()

{

Py_Initialize();

if (!Py_IsInitialized())

{

std::cout << "Initialize failed" << std::endl;

return -1;

}

try

{

object sys_module = import("sys");

str module_directory(".");

sys_module.attr("path").attr("insert")(1, module_directory);

object module = import("zoo");

module.attr("Add")(object(2), object(4));

module.attr("Add")(object(3.0f), object(4));

module.attr("Str")(object("test"));

}

catch (const error_already_set&)

{

PyErr_Print();

}

Py_Finalize();

return 0;

}

编译并测试

# cd build

# make

# ./core

6

7.0

Output: test

类实例

首先修改下Python脚本(zoo.py),添加Pet函数,针对类实例参数的测试,其参数为Animal类实例

import boost

def Pet(obj):

obj.eat("meat")

print(type(obj))

print(isinstance(obj, boost.Animal))

if __name__ == '__main__':

pass

然后修改下main.cpp源文件

#include

#include

#include "boost_wrapper.h"

using namespace boost::python;

using namespace boost::python::detail;

int main()

{

Py_Initialize();

if (!Py_IsInitialized())

{

std::cout << "Initialize failed" << std::endl;

return -1;

}

try

{

object sys_module = import("sys");

str module_directory(".");

sys_module.attr("path").attr("insert")(1, module_directory);

object module = import("zoo");

object o = class_("Animal", init<:string>())

.def("call", &Animal::call)

.def("move", &Animal::move)

.def("eat", &Animal::eat)("Wangcai");

module.attr("Pet")(o);

}

catch (const error_already_set&)

{

PyErr_Print();

}

Py_Finalize();

return 0;

}

编译并测试

# cd build

# make

# ./core

Wangcai: eat meat

False

标准库

首先修改下Python脚本(zoo.py),添加tList、tDict和tTuple函数,分别用于测试std::vector/std::list、std::map以及数组

def tList(l):

for i in l:

print(i)

def tDict(d):

for k in d:

print(str(k) + ":" + str(d[k]))

def tTuple(t):

for i in t:

print(i)

if __name__ == '__main__':

pass

然后修改下main.cpp源文件

#include

#include

#include

#include "boost_wrapper.h"

using namespace boost::python;

using namespace boost::python::detail;

int main()

{

Py_Initialize();

if (!Py_IsInitialized())

{

std::cout << "Initialize failed" << std::endl;

return -1;

}

try

{

object sys_module = import("sys");

str module_directory(".");

sys_module.attr("path").attr("insert")(1, module_directory);

object module = import("zoo");

list l;

l.append(2);

l.append("dog");

std::vector v = {3, 4, 5, 6};

for (auto item : v)

l.append(item);

module.attr("tList")(l);

dict d;

d.setdefault("fwd", 28);

d.setdefault("xb", 26);

module.attr("tDict")(d);

tuple t = make_tuple("fwd", 28, "xb", 26);

module.attr("tTuple")(t);

}

catch (const error_already_set&)

{

PyErr_Print();

}

Py_Finalize();

return 0;

}

编译并测试

# cd build

# make

# ./core

2

dog

3

4

5

6

fwd:28

xb:26

fwd

28

xb

26

总结

类实例还是尽量导出后在Python脚本中创建,如果在C++代码中创建,然后传入Python脚本的话,它的类型并不是boost.Animal,这就导致无法使用isinstance来区分对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是关于 Boost Python 中如何处理参数为结构体指针的情况,以及如何使用 Boost Python 的原始指针构造函数。 首先,对于结构体指针参数,您可以使用 Boost Python 的 `boost::python::ptr` 类型来传递指针。例如,假设您有一个名为 `MyStruct` 的结构体,您可以在 Python 中创建一个 `MyStruct` 的实例,并将其传递给 C++ 函数,代码如下: ```c++ #include <boost/python.hpp> struct MyStruct { int x; int y; }; void my_func(boost::python::ptr<MyStruct> ptr) { if (ptr.get()) { std::cout << "x: " << ptr->x << ", y: " << ptr->y << std::endl; } else { std::cout << "ptr is null" << std::endl; } } BOOST_PYTHON_MODULE(my_module) { boost::python::class_<MyStruct>("MyStruct", boost::python::init<>()) .def_readwrite("x", &MyStruct::x) .def_readwrite("y", &MyStruct::y); boost::python::def("my_func", my_func); } ``` 然后在 Python 中创建一个 `MyStruct` 实例,并将其传递给 `my_func` 函数: ```python import my_module s = my_module.MyStruct() s.x = 10 s.y = 20 my_module.my_func(s) ``` 对于原始指针构造函数,您可以使用 `boost::python::make_constructor` 函数来创建一个构造函数,该构造函数接受一个原始指针作为参数。例如,假设您有一个名为 `MyClass` 的类,它有一个接受 `int` 和 `double` 参数的构造函数,并且您想要创建一个接受 `int*` 和 `double*` 参数的构造函数,代码如下: ```c++ #include <boost/python.hpp> class MyClass { public: MyClass(int x, double y) : x_(x), y_(y) {} private: int x_; double y_; }; MyClass* create_myclass(int* x, double* y) { return new MyClass(*x, *y); } BOOST_PYTHON_MODULE(my_module) { boost::python::class_<MyClass>("MyClass", boost::python::init<int, double>()) .def("__init__", boost::python::make_constructor(&create_myclass)); boost::python::def("create_myclass", &create_myclass, boost::python::return_value_policy<boost::python::manage_new_object>()); } ``` 然后在 Python 中可以使用 `create_myclass` 函数来创建 `MyClass` 实例: ```python import my_module x = 10 y = 20.0 my_obj = my_module.create_myclass(x, y) ``` 需要注意的是,使用原始指针构造函数需要确保手动管理内存,否则可能会导致内存泄漏或者悬挂指针等问题。因此,在上面的例子中,我还使用了 `boost::python::manage_new_object` 策略来确保 Python 自动管理对象的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值