转自:http://www.cnblogs.com/tevic/p/3645197.html

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

系统

Linux 3.11.0-19-generic #33-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('./')"); //引入模块
PyRun_SimpleString("print('----------PyImport_ImportModule')");
PyObject *pModule = PyImport_ImportModule("TestModule");
//获取模块字典属性
PyRun_SimpleString("print('----------PyModule_GetDict')");
PyObject *pDict = PyModule_GetDict(pModule); //直接获取模块中的函数
PyRun_SimpleString("print('----------PyObject_GetAttrString')");
PyObject *pFunc = PyObject_GetAttrString(pModule, "Hello"); //参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
PyRun_SimpleString("print('----------Py_BuildValue')");
PyObject *pArg = Py_BuildValue("(s)", "Hello Charity"); PyRun_SimpleString("print('----------PyEval_CallObject')");
//调用直接获得的函数,并传递参数
PyEval_CallObject(pFunc, pArg); //从字典属性中获取函数
PyRun_SimpleString("print('----------PyDict_GetItemString Add function')");
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); //通过字典属性获取模块中的类
PyRun_SimpleString("print('----------PyDict_GetItemString test class')");
PyObject *pClass = PyDict_GetItemString(pDict, "Test"); //实例化获取的类
PyRun_SimpleString("print('----------PyInstanceMethod_New test class')");
PyObject *pInstance = PyInstanceMethod_New(pClass);
//调用类的方法
PyRun_SimpleString("print('----------PyObject_CallMethod SayHello')");
result = PyObject_CallMethod(pInstance, "SayHello", "(Os)", pInstance, "Charity");
//输出返回值
char* name=NULL;
PyRun_SimpleString("print('----------PyArg_Parse')");
PyArg_Parse(result, "s", &name);
printf("%s\n", name); PyRun_SimpleString("print('Python End')"); //释放python
Py_Finalize();
getchar();
return ;
}

编译:

g++ -I/usr/include/python3.5 pythonwithcpp.cpp -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5

运行结果:

root@ubuntu:/work/src/cython/cppcallpy# ./a.out
----------Python Start
----------PyImport_ImportModule
----------PyModule_GetDict
----------PyObject_GetAttrString
----------Py_BuildValue
----------PyEval_CallObject
Hello World
Hello Charity
----------PyDict_GetItemString Add function
a= 1
b= 2
a+b=3
----------PyDict_GetItemString test class
----------PyInstanceMethod_New test class
----------PyObject_CallMethod SayHello
Hello, Charity
----------PyArg_Parse
Charity
Python End

Python调用C++

C++代码:

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

编译:

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

Python代码:

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

运行:

1 python PythonCallCpp.py

运行结果:

2

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

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

    最近在做一个CUDA的项目,记录下学习心得. 系统 Linux --generic #-Ubuntu x86_64 GNU/Linux C++调用Python Python模块代码: #!/usr/b ...

  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. 从多个角度来理解协方差(covariance)

    起源:协方差自然是由方差衍生而来的,方差反应的是一个变量(一维)的离散程度,到二维了,我们可以对每个维度求其离散程度,但我们还想知道更多.我们想知道两个维度(变量)之间的关系,直观的举例就是身高和体重 ...

  2. python画箱线图

    # -*- coding: utf-8 -*- """ Created on Wed Jun 14 13:00:11 2017 @author: Miao "& ...

  3. 发布npm

    前言 我们npm publish发布的时候,一定是本地文件发布到远程仓库,并且登录到http://registry.npmjs.org(即npm adduser或npmlogin)之后,才可以进行发布 ...

  4. linux软件管理 RPM命令

    RPM命名规则 httpd -2.2.15-15.el6.centos.1.i686.rpm (包全名) httpd 软件包名 (包名) 2.2.15 软件版本 15 软件发布的次数 el6.cent ...

  5. Python *Mix_w4

    1.什么是列表(list) 列表是一个可变的数据类型 列表由[ ]来表示,每一项元素使用逗号隔开.列表什么都能装,能装对象的对象. 列表可以装大量的数据,列表能装所有数据类型 2.列表的索引和切片 列 ...

  6. .net core webapi带权限的文件下载方法

    众所周知,在webapi中,如果有个接口需要权限,一般会将带权限的字段塞进header中.但是,在带权限的文档下载接口中,无论是用post,还是get方式,我们无法设置header头信息.苦恼呀?别急 ...

  7. Python装饰器基础及运行时间

    一.装饰器基础 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会处理被装饰的函数,然后把他返回,或者将其替换成另一个函数或可调用对象. eg:decorate装饰器 @decor ...

  8. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  9. ef core中如何实现多对多的表映射关系

    文档:https://docs.microsoft.com/en-us/ef/core/modeling/relationships class MyContext : DbContext { pub ...

  10. 基于Verilog的带FIFO写入缓冲的串口发送接口封装

    一.模块框图及基本思路 tx_module:串口发送的核心模块,详细介绍请参照前面的“基于Verilog的串口发送实验” fifo2tx_module:当fifo不为空时,读取fifo中的数据并使能发 ...