转载自:
博主:飞越彩虹;
来源:博客园;


C++调用Python


Python模块代码:

#!/usr/bin/python
#Filename:TestModule.py
def Hello(s):print "Hello World"print sdef Add(a, b):print 'a=', aprint 'b=', breturn a + bclass Test:def __init__(self):print "Init"def SayHello(self, name):print "Hello,", namereturn name

C++代码:

#include<iostream>
#include<Python.h>
using namespace std;
int main(int argc, char* argv[])
{//初始化pythonPy_Initialize();//直接运行python代码PyRun_SimpleString("print 'Python Start'");//引入当前路径,否则下面模块不能正常导入PyRun_SimpleString("import sys");  PyRun_SimpleString("sys.path.append('./')");  //引入模块PyObject *pModule = PyImport_ImportModule("TestModule");//获取模块字典属性PyObject *pDict = PyModule_GetDict(pModule);//直接获取模块中的函数PyObject *pFunc = PyObject_GetAttrString(pModule, "Hello");//参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档PyObject *pArg = Py_BuildValue("(s)", "Hello Charity");//调用直接获得的函数,并传递参数PyEval_CallObject(pFunc, pArg);//从字典属性中获取函数pFunc = PyDict_GetItemString(pDict, "Add");//参数类型转换,传递两个整型参数pArg = Py_BuildValue("(i, i)", 1, 2);//调用函数,并得到python类型的返回值PyObject *result = PyEval_CallObject(pFunc, pArg);//c用来保存c/c++类型的返回值int c;//将python类型的返回值转换为c/c++类型PyArg_Parse(result, "i", &c);//输出返回值printf("a+b=%d\n", c);//通过字典属性获取模块中的类PyObject *pClass = PyDict_GetItemString(pDict, "Test");//实例化获取的类PyObject *pInstance = PyInstance_New(pClass, NULL, NULL);//调用类的方法result = PyObject_CallMethod(pInstance, "SayHello", "(s)", "Charity");//输出返回值char* name=NULL;PyArg_Parse(result, "s", &name);printf("%s\n", name);PyRun_SimpleString("print 'Python End'");//释放pythonPy_Finalize();getchar();return 0;
}

编译:

g++ -I/usr/include/python2.7 PythonWithCpp.cpp -lpython2.7

运行结果:

Python Start
Hello World
Hello Charity
a= 1
b= 2
a+b=3
Init
Hello, Charity
Charity
Python End

Python调用C++


C++代码:

//用C++必须在函数前加extern "C"extern "C" int Add(int a,int b)
{return a+b;
}

编译:

g++ -c -fPIC LibPythonTest.cpp
g++ -shared LibPythonTest.o -o LibPythonTest.so

Python代码:

#!/bin/python
#Filename:PythonCallCpp.py
from ctypes import *
import os
libPythonTest = cdll.LoadLibrary('./LibPythonTest.so')
print libPythonTest.Add(1,1)

运行:

python PythonCallCpp.py

运行结果:

2

注意: python2和python3的版本中print等函数语法可能不同:例如:print “hello”(python2)—>print(“hello”)(python3)


Ubuntu下Python与C/C++混合编程相关推荐

  1. python和C语言混合编程实例

    转载自:http://www.jb51.net/article/50633.htm 这篇文章主要介绍了python和C语言混合编程实例,文中开发了一个tcp端口ping程序来介绍混合编程,需要的朋友可 ...

  2. Ubuntu下Python安装了依赖包后仍然找不到包 python setup.py install 解决方案

    Ubuntu下Python安装了依赖包后仍然找不到包 python setup.py install 解决方案 参考文章: (1)Ubuntu下Python安装了依赖包后仍然找不到包 python s ...

  3. Ubuntu下Python使用指南

    Ubuntu下python配置 Ubuntu简单解决多版本python切换以及多版本pip对应问题 python及库在linux下的目录 在ubuntu下pip需要自行安装 sudo apt-get ...

  4. ubuntu 下 python 安装 venv

    ubuntu 下 python 安装 venv 1.首先,确保您的系统已安装 Python3 和 pip3,如果没有安装,可以使用以下命令安装: 2. 接着,安装 virtualenv 包,使用以下命 ...

  5. 记录 win10/Ubuntu18 双系统安装 附Ubuntu下Python,TensorFlow的使用问答

    1.去Linux官网下载Ubuntu 18. 2.U盘刻录Ubuntu: 最新UltraISO官方免费下载 - UltraISO软碟通中文官方网站 https://cn.ultraiso.net/xi ...

  6. 《Python开发 - Python杂记》Python与C/C++混合编程

    Python是脚本语言,可以做的事情非常的多,本文将要讲解使用Python来调用C/C+库. 关于C/C++库的创建请看笔者以前的文章,这里只给出Window下的创建过程. 静态库和动态库(Windo ...

  7. ARM下C语言和汇编语言混合编程

    文章目录 一. 在C语言中调用汇编语言 1. 编写代码 2. 调试验证 二. 在汇编语言中调用C语言 1. 编写代码 2. 调试验证 关于函数的传递参数以及接受返回值的原理,在另一篇博客:X86与AR ...

  8. Ubuntu 下 Python 版本管理

    一.ubuntu与python   ubuntu系统自带python2.7.python3.5两个默认版本,ubuntu自身很多功能都依赖于python2.7.python3.5,所以不管你要用哪个版 ...

  9. ubuntu下python多版本切换问题

    一般情况下,ubunu系统下会自带python,你如果安装了其它版本的python,就会出现多个版本的python,因此想要在ubuntu终端下切换不同的版本,就是设置你默认的python版本,这里演 ...

最新文章

  1. 5/29 c的结构体变量
  2. 李开复「预见2021」:自动化成企业升级转型刚需 | AI日报
  3. 马斯克要办大学上了热搜
  4. oracle质数怎么算,借花献佛之使用Oracle sql求质数(笔记)
  5. mysql集群会备份数据吗_mysql集群即双机备份与主从复制
  6. 鸿蒙51单片机,基于C51系列单片机的交通控制系统设计
  7. Eclipse 搭建Android开发环境(整理)
  8. python中__init__函数以及参数self
  9. 【2016年第4期】研究(国家自然科学基金项目成果集萃)导读
  10. golang 类型说明
  11. 在线CSV转YAML工具
  12. java毕业实习日志_《Java课程实习》日志(周一)
  13. Spring学习-黎活明视频学习注解
  14. 三星android截屏快捷键是什么,三星s10截屏快捷键是什么
  15. 排查线上CPU飙高的原因和解决
  16. html absolute溢出,position:absolute溢出处理
  17. Android6.0权限的处理
  18. python输出26个大小写字母_python实现生成字符串大小写字母和数字的各种组合
  19. java当中怎么测试异步接口【杭州多测师_王sir】【杭州多测师】
  20. Android熄屏与亮屏控制

热门文章

  1. 容器编排技术 -- Kubernetes入门概述
  2. Primefaces,Spring 4 with JPA(Hibernate 4 / EclipseLink)示例教程
  3. 数据可视化组件Grafana详细解读--Debian/Ubuntu上的安装
  4. 2021 npm安装Electron失败解决方法
  5. C# 使用TcpClient 测试网络连接是否正常
  6. Codeforces Round #617 (Div. 3) String Coloring(E1.E2)
  7. JavaScript性能优化【下】--性能优化的具体方式
  8. 通用职责分配软件原则之3-低耦合原则
  9. css索引_CSS中的Z索引:它是什么以及它做什么
  10. Java的synchronized的使用_Java中synchronized的用法