早就听说过了对于复杂的系统一般会结合多种语言进行开发,最近摸索了下C++和Python混合编程,在此总结一下,做为笔记。

对于C++和python混合编程实际上包含两部分内容:

用C++写python扩展(extending): 即所谓的在python中调用C/C++代码,一般用于对效率要求高核心模块用C/C++编写,通过一些处理后生成动态库如cppmod.so,然在python代码中import cppmod,即可调用C/C++

python脚本嵌入到C++程序中(embedding): 即所谓的C++代码调用python,C++ app要嵌入python解析器从而调用python代码

就实现而言,对于这两者都可以直接用Python/C API,具体可以去参考python文档,但都比较麻烦

对于1, 主要的方案有 boost.python 以及swig, 后者不太了解,本篇主要讲利用boost.python,对C/C++处理后生成动态库,python导入后调用C/C++代码

对于2, C/C++代码中嵌入python,也可以用 boost.python,当然直接 Python/C API也可以

##一、Python C API写 python embedding

python嵌入 C/C++ 的程序,我们需要在一条 #include 语句处含入 Python.h,并在程序开始时调用 Py_Initialize(),在程序结束时调用 Py_Finalize()。

#include

// using python c API to wrte a python embedding

const static char* python_code = "\

from time import time,ctime\n\

print 'Today is', ctime(time())\n";

int main()

{

Py_Initialize();

PyRun_SimpleString(python_code);

Py_Finalize();

return 0;

}

编译:

[tanli@p04bc boostpython]$g++ sampleEmbed.cpp -I /usr/include/python2.7 -lpython2.7 -o sampleEmbed

[tanli@p04bc boostpython]$./sampleEmbed

Today is Fri Nov 22 10:18:50 2013

##二、boost.python 写 python embedding

boost.python 写python embedding更简单些,exec执行一个语句,exec_file执行一个python程序

#include

#include

using namespace std;

using namespace boost::python;

int main(int argc, char *argv[])

{

Py_Initialize();

object main_module = import("__main__");

object main_namespace = main_module.attr("__dict__");

exec("hello = file('hello.txt', 'w')\n"

"hello.write('Hello world!')\n"

"hello.close()",

main_namespace);

exec("result = 5 ** 2", main_namespace);

int five_squared = extract(main_namespace["result"]);

cout << "The five_squeared caculated by python is " << five_squared << endl;

// Load the sys module.

object sys = import("sys");

// Extract the python version.

std::string version = extract(sys.attr("version"));

std::cout << version << std::endl;

object simple = exec_file("simple.py",main_namespace, main_namespace);

object add = main_namespace["add"];

int val = extract(add(5, 100));

cout << "Python has caculated add as " << val << endl;

return 0;

}

编译运行下:

[tanli@p04bc boostpython]$./embeddByBooostPy

The five_squeared caculated by python is 25

2.7 (r27:82500, Oct 20 2010, 13:31:35)

[GCC 3.4.5 20051201 (Red Hat 3.4.5-2)]

Python has caculated add as 105

python和其它语言混合编程_C++和Python混合编程 - python嵌入C++相关推荐

  1. python做脚本语言要了解什么_你真的了解Python吗?本文可以让你对Python了解更深入...

    人们为什么使用Python? 之所以选择Python的主要因素有以下几个方面:软件质量:在很大程度上,Python更注重可读性.一致性和软件质量,从而与脚本语言世界中的其他工具区别开发.此外,Pyth ...

  2. python和c语言相通吗_C语言和Python有什么区别呢?

    展开全部 python与C的区别如下. 1.语言类型不同. Python是一种动态类型语言,又是强类型语言.它们确定一个变量的类型是在e69da5e887aa323131333532363134313 ...

  3. python比c语言好学吗-总算找到c语言和python哪个好学

    Python的语法非常特殊,它是由空格严格控制的.然而,这对那些刚接触编程的人来说并不好.下面小编就来给大家讲一讲c语言和python哪个好学,希望对你有帮助 很多钻研编程的学者都有个问题,那就是,c ...

  4. cURL到Python/Aardio/易语言(将curl格式文本解析成Python、易语言、AardioGolang、VBA、PowerQuery、Json)20210811

    软件缘由 由于本人经常写爬虫,手动构造协议头和post数据很麻烦,而且还容易出错.于是乎,就做了现在的这个.目前支持转成Python.Aardio.易语言.Golang.VBA.PowerQuery. ...

  5. python十大语言领域_2017年十大编程语言,Python最流行,JAVA老化,GO语言野蛮增长!...

    2017 年上半年哪家编程语言流行呢?当然非Python莫属,Python可是今年上半年最流行的语言. 根据IEEE Spectrum 的记者挖掘的数据,由10 个在线来源组合了 12 种指标给 48 ...

  6. python和c语言区别大吗_C语言和python的区别

    Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...

  7. Python调用C语言(DLL)

    前言:本文可结合Python调用C++语言(DLL)使用,效果更佳. 采用导出形式:__declspec(dllexport) 功能 无参数,无返回类型 有参数,有返回值 [不需要修改参数数值] 有参 ...

  8. python与c语言在语法上的区别-python和c语言的区别是什么

    Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...

  9. python是用c写的吗-python和c语言的区别是什么

    Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...

  10. python是c语言写的吗-C语言和python的区别

    Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...

最新文章

  1. erlang supervisor simple_one_for_one实例
  2. android仿微博头像_Android 仿instagram和微博的头像点击加载动画
  3. c#读取xml文件配置文件Winform及WebForm-Demo具体解释
  4. webbrowser填充textarea的问题
  5. poj 3579 Median 中间值(二分搜索)
  6. linux将ipv6地址改成ipv4,虚拟机ip地址从ipv6改为ipv4相关问题
  7. java web 之间通信,【Java】Web发展中通信的方式有哪些呢?
  8. [XSY] 最长公共子串对(后缀自动机)
  9. bootstrap学习笔记(2)表单设计
  10. Android杂谈--ListView之SimpleAdapter的使用
  11. 《DSP using MATLAB》示例Example 8.5
  12. nginx编译包含perl模块
  13. 为什么root下不能使用passwd命令_Linux:CentOS 7中常用的基础命令
  14. 系统分析和设计方法之数据建模和分析
  15. 全球电动汽车电池隔膜行业调研及趋势分析报告
  16. 《明朝那些事儿》--主要人物整理
  17. 三菱FX系列PLC简单总结
  18. 如何隐藏CAD图层?怎么显示隐藏的CAD图层?
  19. MapReduce程序中的万能输入FileInputFormat.addInputPaths
  20. 5. 机器学习基石-Why can Machine Learn?

热门文章

  1. 七easy网络陷阱上当
  2. telnet无法访问
  3. makefile编写---:= ?= += =的区别
  4. C# 通过优酷网址 获取flash真实地址
  5. Java- String类概述
  6. 【Kafka】01 生产者
  7. Visual Studio 2017各版本离线安装包获取以及安装教程
  8. Mybaits的运行原
  9. eclipse下提交job时报错mapred.JobClient: No job jar file set. User classes may not be found.
  10. 卸载oracle 10g