你将学到什么

在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来区分对象。

boost python单步调试_Boost Python学习笔记(三)相关推荐

  1. python 容器类型存放_Python学习笔记三(容器)

    基本数据类型 int Python3中的整数只有int,没有long类型,int最大值如下, Python3中int的最大值的获取 float Python3中float 默认保留一位小数,/ 除法默 ...

  2. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

  3. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  4. Python基础教程-菜鸟教程学习笔记1

    Python基础教程-菜鸟教程学习笔记1 文章目录 Python基础教程-菜鸟教程学习笔记1 前言 Python 简介 1. 第一个Python程序 2. Python 中文编码 3. 基本语法 1) ...

  5. Python预测 数据分析与算法 学习笔记(特征工程、时间序列)

    微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...

  6. Python可视化物理随机过程---pygame学习笔记2

    Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...

  7. ROS学习笔记三:创建ROS软件包

    ,# ROS学习笔记三:创建ROS软件包 catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 这个软件包必须包含一个catkin编译文件package.xml(man ...

  8. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  9. python3常用模块_Python学习笔记三(常用模块)

    Python 学习笔记三 (常用模块) 1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称( ...

  10. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

最新文章

  1. WPF中ControlTemplate和DataTemplate的区别
  2. 小县城也被互联网+撞了一下腰
  3. 10种常用降维算法源代码(python)
  4. HDFS的副本存放策略(机架感知策略)
  5. 国内知名互联网公司的开源项目
  6. 获取本机IP地址[JavaScript / Node.js]
  7. 200(强缓存)和304(协商缓存)的区别
  8. 成为Java流大师–第5部分:将联接的数据库表转换为流
  9. BaseYii_autoload
  10. pojBuy Tickets2828线段树或者树状数组(队列中倒序插队)
  11. css @语法,@规则 @import @charset @font-face @fontdef @media @page
  12. VB计算文本文件的行数
  13. git clone --depth=1引起的问题
  14. 联想电脑的计算机,联想笔记本系统按F几下|联想计算机的系统按钮是什么?
  15. 台达plc控制伺服电机编程实例_三菱Q系列PLC控制伺服电机编程实例
  16. android系统存储空间不足怎么办,手机内存不足怎么办?手机内存不足如何清理?...
  17. Postgresql临时表
  18. iOS7—Day by day—Day16:Decoding QR Codes With AVFoundation
  19. 03_跳转sucess方法和error方法
  20. 奇技淫巧(二)—— 不使用中间变量交换两个值

热门文章

  1. 长沙课工场中秋节五仁来袭
  2. 你也对阅读源码感兴趣,说说我是如何阅读Nacos源码的
  3. 2010-11-17
  4. 【Axure高保真原型】人物列表选择器(穿梭框)
  5. 小议:SharePoint 2013不能把Shred Storage Disable的解决方案?
  6. RocketMQ之消费者启动与消费流程
  7. 泡沫退去 看中国大数据四大如何锁定商业模式
  8. 安装3ds Max2020出现错误代码:1063
  9. 安永发布全新的以太坊 L2 方案,可减少近90%的Gas费用
  10. 腾讯2019年暑期实习生招聘提前批在线笔试技术研究和数据分析方向(python)