最近在做一个CUDA的项目,记录下学习心得.

系统

Linux 3.11.--generic #-Ubuntu x86_64 GNU/Linux

C++调用Python

Python模块代码:

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

C++代码:

 #include<iostream>
#include<Python.h>
using namespace std;
int main(int argc, char* argv[])
{
//初始化python
Py_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)", , ); //调用函数,并得到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'"); //释放python
Py_Finalize();
getchar();
return ;
}

编译:

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

运行结果:

Python Start
Hello World
Hello Charity
a=
b=
a+b=
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

运行结果:


Linux下Python与C++混合编程的更多相关文章

  1. [转]Linux下Python与C++混合编程

    转自:http://www.cnblogs.com/tevic/p/3645197.html 最近在做一个CUDA的项目,记录下学习心得. 系统 Linux 3.11.0-19-generic #33 ...

  2. 在linux环境下python与C++混合编程

    参考:在linux环境下编译C++ 程序 linux下python3调用c代码或者python3调用c++代码 https://blog.csdn.net/u013179327/article/det ...

  3. Linux下Python 文件内容替换脚本

    Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...

  4. Linux下python安装升级详细步骤 | Python2 升级 Python3

    Linux下python升级步骤  Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...

  5. linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...

  6. Linux下python安装升级详细步骤 | Python2 升级 Python3 转载

    Linux下python升级步骤  Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...

  7. linux下Python网络编程框架-Twisted安装

    Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...

  8. linux下python启动第三方程序,并控制关闭

    import subprocess import os import signal p = subprocess.Popen("recordmydesktop -o /home/test/t ...

  9. Linux下python升级步骤

    先安装openssl,openssl-devel yum install openssl yum install openssl-devel 1切换到指定的目录下: cd /usr/local 2下载 ...

随机推荐

  1. django面试八

    1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. #2.Dja ...

  2. Python 实例变量

    class Person: def __init__(self, name, id, gender, birth): self.name = name # 实例变量 对象里的变量 self.id = ...

  3. JAVA_全局配置文件(配置网址,url等等)_第二种方式

    @ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中 1.application-local.yml 配置文件 2.Service 3. ...

  4. JAVA多线程Thread与Runnable

    一.Runnable Runnable为一个之包含一个run方法的接口 public class MyRunnable implements Runnable{ @Override //表示:预示重写 ...

  5. JavaBasic_07

    面向对象三大特征 1.封装 封装是一种信息隐藏技术 a.是指数据和基于数据的操作封装在一起,数据被保护在内部(类的内部(对象)) b.系统的其他部分只有通过在数据外面的被授权的操作才能进行交互(没有授 ...

  6. hdu--1029 编程之美 在数组a中 (元素个数n n是奇数)找一个数字 它出现的次数大于(n+1)/2

    我为什么总是犯这些愚蠢错误啊,还是自己逻辑不够严谨. 努力ing...... #include <iostream> #include <cstdio> #include &l ...

  7. P2279 消防局的设立(贪心+dp)

    题目链接:传送门 题目大意: 给定一棵树(N个基地N-1条边): 用半径为2的消防局覆盖这N个基地,问最小的消防局数量. (树上距离为k的最小覆盖问题) 思路: 每次贪心地找到不被覆盖的最深的一个节点 ...

  8. java-this和super的区别

    1.this和super都代表什么: - this:代表当前对象的引用,谁来调用我,我就代表谁 - super:代表当前对象父类的引用 - super(...)或者this(...)必须放在构造方法的 ...

  9. python在图片上画矩形

    python在图片上画矩形 image_path = '' image = cv2.imread(image_path) first_point = (100, 100) last_point = ( ...

  10. js中数组的去重

    第一种方式: var ss=['小红','小花','小兰','小花'] var uu=[] for(var i=0;i<ss.length;i++){ if(uu.indexOf(ss[i])= ...