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

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

系统

  1. Linux 3.11.0-19-generic #33-Ubuntu x86_64 GNU/Linux

C++调用Python

Python模块代码:

  1. #!/usr/bin/python
  2. #Filename:TestModule.py
  3. def Hello(s):
  4. print ("Hello World")
  5. print(s)
  6.  
  7. def Add(a, b):
  8. print('a=', a)
  9. print ('b=', b)
  10. return a + b
  11.  
  12. class Test:
  13. def __init__(self):
  14. print("Init")
  15. def SayHello(self, name):
  16. print ("Hello,", name)
  17. return name

C++代码

  1. #include<iostream>
  2. #include<Python.h>
  3. using namespace std;
  4. int main(int argc, char* argv[])
  5. {
  6. //初始化python
  7. Py_Initialize();
  8.  
  9. //直接运行python代码
  10. PyRun_SimpleString("print('----------Python Start')");
  11.  
  12. //引入当前路径,否则下面模块不能正常导入
  13. PyRun_SimpleString("import sys");
  14. PyRun_SimpleString("sys.path.append('./')");
  15.  
  16. //引入模块
  17. PyRun_SimpleString("print('----------PyImport_ImportModule')");
  18. PyObject *pModule = PyImport_ImportModule("TestModule");
  19. //获取模块字典属性
  20. PyRun_SimpleString("print('----------PyModule_GetDict')");
  21. PyObject *pDict = PyModule_GetDict(pModule);
  22.  
  23. //直接获取模块中的函数
  24. PyRun_SimpleString("print('----------PyObject_GetAttrString')");
  25. PyObject *pFunc = PyObject_GetAttrString(pModule, "Hello");
  26.  
  27. //参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
  28. PyRun_SimpleString("print('----------Py_BuildValue')");
  29. PyObject *pArg = Py_BuildValue("(s)", "Hello Charity");
  30.  
  31. PyRun_SimpleString("print('----------PyEval_CallObject')");
  32. //调用直接获得的函数,并传递参数
  33. PyEval_CallObject(pFunc, pArg);
  34.  
  35. //从字典属性中获取函数
  36. PyRun_SimpleString("print('----------PyDict_GetItemString Add function')");
  37. pFunc = PyDict_GetItemString(pDict, "Add");
  38. //参数类型转换,传递两个整型参数
  39. pArg = Py_BuildValue("(i, i)", , );
  40.  
  41. //调用函数,并得到python类型的返回值
  42. PyObject *result = PyEval_CallObject(pFunc, pArg);
  43. //c用来保存c/c++类型的返回值
  44. int c;
  45. //将python类型的返回值转换为c/c++类型
  46. PyArg_Parse(result, "i", &c);
  47. //输出返回值
  48. printf("a+b=%d\n", c);
  49.  
  50. //通过字典属性获取模块中的类
  51. PyRun_SimpleString("print('----------PyDict_GetItemString test class')");
  52. PyObject *pClass = PyDict_GetItemString(pDict, "Test");
  53.  
  54. //实例化获取的类
  55. PyRun_SimpleString("print('----------PyInstanceMethod_New test class')");
  56. PyObject *pInstance = PyInstanceMethod_New(pClass);
  57. //调用类的方法
  58. PyRun_SimpleString("print('----------PyObject_CallMethod SayHello')");
  59. result = PyObject_CallMethod(pInstance, "SayHello", "(Os)", pInstance, "Charity");
  60. //输出返回值
  61. char* name=NULL;
  62. PyRun_SimpleString("print('----------PyArg_Parse')");
  63. PyArg_Parse(result, "s", &name);
  64. printf("%s\n", name);
  65.  
  66. PyRun_SimpleString("print('Python End')");
  67.  
  68. //释放python
  69. Py_Finalize();
  70. getchar();
  71. return ;
  72. }

编译:

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. 1 //用C++必须在函数前加extern "C"
  2. 2 extern "C" int Add(int a,int b)
  3. 3 {
  4. 4 return a+b;
  5. 5 }

编译:

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

Python代码:

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

运行:

  1. 1 python PythonCallCpp.py

运行结果:

  1. 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. WordPress 本地建站

    1.搭建环境 appserv下载链接:http://www.onlinedown.net/soft/35753.htm 安装 1.直接运行 2.选择安装路径 3.选择所需环境,若已经有,则可不勾选 4 ...

  2. postman(二):使用postman发送get or post请求

    总结一下如何使用postman发送get或post请求 请求 一.GET请求 通常用于请求服务器发送某个资源,请求的数据会附在URL之后,以?分割URL和传输数据,多个参数用&连接 1.请求方 ...

  3. Dagger2

    一.理解Dagger2原理 原文链接 二.Dagger2例子实战 原文链接 Demo地址 注:关于错误:IncompleteAnnotationException: dagger.Provides m ...

  4. script利用src引用外部js文件,如果内部嵌套了js代码呢

    <script src='test.js' defer async> var a = 5; </script> 这个时候 var a = 5;会被忽略.

  5. 『TensorFlow』分类问题与两种交叉熵

    关于categorical cross entropy 和 binary cross entropy的比较,差异一般体现在不同的分类(二分类.多分类等)任务目标,可以参考文章keras中两种交叉熵损失 ...

  6. mysql sql文件批量处理

    简单动作复杂化,导致处理文件误入坑, 数据库拷贝,备份还原是每个面向对象的开发人员避免不了的动作,在数据库使用中,习惯性的使用第三方数据库管理软件,最近需要做数据库迁移,导出的批量sql文件不知如何区 ...

  7. 3D打印GCODE文件学习(二)

    大家可以自己实践一下,那么怎么打开GCODE呢?很简单,只要在桌面上创建一个word文档,然后把“.”后面的docx改成GCODE,它会跳出一个是否更改的框,点击是就行了,然后右键,点击Edit wi ...

  8. 【转】python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)

    二.常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准 ...

  9. jq demo 九宫格抽奖

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. Linux分区知识及企业场景分区76

    文件系统就相当于装修一样.这个硬盘拿过来了,分完区了,没有格式化. 没有格式化就相当于没有装修.[分区]不是必须的. 如果没有文件系统就不能放数据,文件系统可以理解为一个软件, 它的实现形式是软件,这 ...