你将学到什么

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

基础类型

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

def Add(x, y):
print(x + y) def Str(s):
print("Output: " + s) if __name__ == '__main__':
pass

然后修改下main.cpp源文件

#include <iostream>
#include <boost/python.hpp>
#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 <iostream>
#include <boost/python.hpp>
#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_<AnimalWrap, boost::noncopyable>("Animal", init<std::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
<class 'Animal'>
False

标准库

首先修改下Python脚本(zoo.py),添加tListtDicttTuple函数,分别用于测试std::vector/std::liststd::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 <iostream>
#include <vector>
#include <boost/python.hpp>
#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<int> 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学习笔记(三)的更多相关文章

  1. Python 学习笔记三

    笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...

  2. Boost Python学习笔记(四)

    你将学到什么 在Python中调用C++代码时的传参问题 基础类型 Python的字符串是常量,所以C++函数参数中的std::string &必须为const 修改源文件(main.cpp) ...

  3. Boost Python学习笔记(五)

    你将学到什么 在C++中调用Python代码时的返回值问题 基础类型 修改Python脚本(build/zoo.py) def rint(): return 2 def rstr(): return ...

  4. Boost Python学习笔记(二)

    你将学到什么 如何在Python中调用C++代码 如何在C++中调用Python代码 在Python中调用C++代码 首先定义一个动物类(include/animal.h) #pragma once ...

  5. webdriver(python) 学习笔记三

    知识点:简单的对象定位 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象.一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪 ...

  6. python学习笔记三--字典

    一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...

  7. Python学习笔记三

    一. 为什么要使用函数? 函数可以方便阅读代码. 函数可以减少重复代码. 函数可以减少管理操作,减少修改操作. 二. 函数分类: 内置函数:len()   sum()   max()   min() ...

  8. python学习笔记(三)、字典

    字典是一种映射类型的数据类型.辣么什么是映射呢?如果看过<数据结构与算法>这一本书的小伙伴应该有印象(我也只是大学学习过,嘻嘻). 映射:就是将两个集合一 一对应起来,通过集合a的值,集合 ...

  9. Python学习笔记三:模块

    一:模块 一个模块就是一个py文件,里面定义了一些业务函数.引用模块,可以用import语句导入.导入模块后,通过 模块.函数名(参数)  来使用模块中的函数.如果存在多个同名模块,则前面模块名需要加 ...

随机推荐

  1. Java -- eclipse常用快捷键

  2. static_cast, dynamic_cast, const_cast 三种类型转化的区别

    强制转化四种类型可能很多人都常常忽略就象我一样,但是有时还是比较有用的.不了解的建议看看,一些机制我也不是十分了解,只是将一些用法写出来让大家看看.                           ...

  3. wget下载文件

    http://blog.sina.com.cn/s/blog_4af3f0d20100n1k0.html 一.下载目录 #wget -r -np -nd http://example.com/pack ...

  4. linux lvm

    一.linux的lv(logical volume) lv各层次示例图如下: 核心思想:最底层的pv就是一个一个的磁盘,在保证总体容量的情况下,可以移除部分磁盘,在pv上面设置一个vg,相当于vg把所 ...

  5. linux-常用指令1

    掌握下面的命令是最基本的噢!那是我们使用一个系统最基本的操作. 玩过dos么,其实,linux下的文件操作和dos差不多.没什么难的,多练习就记住了.下面如果有条件的话请跟我一样操作吧!百看不如一做. ...

  6. jQuery插件--图片文字向上向左循环滚动

    需要引用jquery 调用非常简单: 一. 向上滚动 $(".scroll_two").jScroll({vertical: true}); <div class=" ...

  7. Web Service 之JAX-WS 与CXF实现

    Web Service的实现方式有很多种,本篇介绍的是基于JAX-WS(纯Java)实现的,然后借由CXF工具生成Javabean. 第一步:创建一个Java工程,编写CalService接口,此接口 ...

  8. 把自定义的decoder加入ffmpeg源码

    第一步: 在libavcodec目录下新建mkdecoder.c,并加入一下代码: /* *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame *作者:缪国凯(MK) *82 ...

  9. Gym - 100570B :ShortestPath Query(SPFA及其优化)

    题意:给定N点M边的有向图,每条边有距离和颜色,一条有效路径上不能有相邻的边颜色相同.现在给定起点S,多次讯问S到点X的最短有效距离. TLE思路:用二维状态dis(u,c)表示起点到u,最后一条边的 ...

  10. 洛谷【P1177】【模板】归并排序

    题目传送门:https://www.luogu.org/problemnew/show/P1177 归并排序: 1.先将\(a\)数组的区间\([l,mid],[mid+1,r]\)排成有序的. 2. ...