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

你将学到什么

在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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值