Linux下Python与C++混合编程
最近在做一个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++混合编程的更多相关文章
- [转]Linux下Python与C++混合编程
转自:http://www.cnblogs.com/tevic/p/3645197.html 最近在做一个CUDA的项目,记录下学习心得. 系统 Linux 3.11.0-19-generic #33 ...
- 在linux环境下python与C++混合编程
参考:在linux环境下编译C++ 程序 linux下python3调用c代码或者python3调用c++代码 https://blog.csdn.net/u013179327/article/det ...
- Linux下Python 文件内容替换脚本
Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...
- Linux下python安装升级详细步骤 | Python2 升级 Python3
Linux下python升级步骤 Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...
- linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...
- Linux下python安装升级详细步骤 | Python2 升级 Python3 转载
Linux下python升级步骤 Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...
- linux下Python网络编程框架-Twisted安装
Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...
- linux下python启动第三方程序,并控制关闭
import subprocess import os import signal p = subprocess.Popen("recordmydesktop -o /home/test/t ...
- Linux下python升级步骤
先安装openssl,openssl-devel yum install openssl yum install openssl-devel 1切换到指定的目录下: cd /usr/local 2下载 ...
随机推荐
- Allocation-Free Collections
假设你有一个方法,通过创建临时的List来收集某些数据,并根据这些数据来统计信息,然后销毁这个临时列表.这个方法被经常调用,导致大量内存分配和释放以及增加的内存碎片.此外,所有这些内存管理都需要时间, ...
- kbmMW 5.07.00试用笔记
在kbmMW 5.06.20试用笔记中遇到的问题,在这个版本中,基本都解决了.但还是发现修正后存在的小问题及新问题: 1.Resolve返回值错误 当提交的ClientQuery是执行一条sql语句, ...
- hbuilder注意事项
App开发注意事项App开发注意事项 单个页面由多个webView组成注意事项. 有两种不同的加载方式. 1.在加载主webView时,初始化Init()时就加载子页面, 此时为异步加载! 2.在主w ...
- [转]Spark 踩坑记:数据库(Hbase+Mysql)
https://cloud.tencent.com/developer/article/1004820 Spark 踩坑记:数据库(Hbase+Mysql) 前言 在使用Spark Streaming ...
- JAVA面向对象和类
一.构造方法 1.构造方法是一个与类同名的方法,用来对类进行实例化(创建对象) 2.特点 1).构造方法没有返回值: 2).构造方法的名称要与本类的名称相同. 例 public class Test{ ...
- [LeetCode&Python] Problem 217. Contains Duplicate
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- 测试那些事儿—浅谈TCP/IP协议
TCP/IP协议是一系列网络协议的总和,是构成网络通信的核心骨架. TCP/IP的工作原理通俗的讲就是一个主机的数据要经过哪些过程才能发送到对方的主机上. TCP/IP协议采用四层结构,分别为应用层, ...
- C++学习(一)之Visual Studio安装以及首次使用
一.安装Visual Studio 首先下载Visual Studio 链接: http://pan.baidu.com/s/1pLhJt0Z 密码:uqyc 将.ios文件解压得到以下文件: 点击v ...
- controller层,service层,dao层(main函数,子函数,子的子函数)
controller层相当于main函数————————————————————————————————————————————————————@RequestMapping("/query ...
- showdoc 开源在线api&&技术文档管理工具
showdoc 是一个很不错的api 以及技术文档管理工具 环境准备 doker-copose 文件 version: "3" services: doc: image: regi ...