你将学到什么

  • 在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. JS正则表达式,记录自己所学所用的内容

    还没接触正则表达式感觉确实有那么点难度,但接触到后自己琢磨了几天也没发现那么难. 现在教教刚学的或者还没接触正则表达式的同学们入入门,一起学习. 正则表达式基本语法 ***************** ...

  2. PHP限制IP访问 只允许指定IP访问 允许*号通配符过滤IP

    /** * 检测访问的ip是否为规定的允许的ip * Enter description here ... */ function check_ip(){ $ALLOWED_IP=array('192 ...

  3. 分享知识-快乐自己:Liunx 搭建 Dubbo

    1.首先配置JDK  操作步骤 2.部署 Tomcat ① 上传 Tomcat 7  解压jdk文件:tar -zxvf jdk文件名称 ② tomcat目录下的bin/启动tomcat ③ tail ...

  4. POJ1060 Modular multiplication of polynomials解题报告 (2011-12-09 20:27:53)

    Modular multiplication of polynomials Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3 ...

  5. Selenium-鼠标操作

    有些特殊的系统可能需要模拟键盘或者鼠标的操作才可以 鼠标的操作不仅仅是click()单击操作,还有很多包含在ActionChains类中 context_click(elem) 右击鼠标点击元素ele ...

  6. C易位构词(华师网络赛)(错排)

    Time limit per test: 2.0 seconds Memory limit: 256 megabytes 易位构词 (anagram),指将一个单词中的字母重新排列,原单词中的每个字母 ...

  7. msdtc中rpc调试

    http://www.cnblogs.com/nzperfect/archive/2011/11/03/2234595.html 1 工具: dtcping 2 配置 3 netboise

  8. 每天一个linux命令(12):nl命令

    版权声明更新:2017-05-16博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...

  9. ACM学习历程—HDU 5023 A Corrupt Mayor's Performance Art(广州赛区网赛)(线段树)

    Problem Description Corrupt governors always find ways to get dirty money. Paint something, then sel ...

  10. POJ1365:质因数分解

    Prime Land Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3590   Accepted: 1623 Descri ...