python编译为c(python调用c函数)

1.python调用c函数

Python是解释性语言, 底层就是用c实现的, 所以用python调用C是很容易的, 下面就总结一下各种调用的方法, 给出例子, 所有例子都在ubuntu9.10, python2.6下试过1. Python 调用 C (base)想在python中调用c函数, 如这儿的fact#include int fact(int n){ if (n <= 1) return 1; else return n * fact(n - 1);}PyObject* wrap_fact(PyObject* self, PyObject* args){ int n, result; if (! PyArg_ParseTuple(args, "i:fact", &n)) return NULL; result = fact(n); return Py_BuildValue("i", result);}static PyMethodDef exampleMethods[] ={ {"fact", wrap_fact, METH_VARARGS, "Caculate N!"}, {NULL, NULL}};void initexample(){ PyObject* m; m = Py_InitModule("example", exampleMethods);}把这段代码存为wrapper.c, 编成so库,gcc -fPIC wrapper.c -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config然后在有此so库的目录, 进入python, 可以如下使用import exampleexample.fact(4)2. Python 调用 C++ (base)在python中调用C++类成员函数, 如下调用TestFact类中的fact函数,#include class TestFact{ public: TestFact(){}; ~TestFact(){}; int fact(int n);};int TestFact::fact(int n){ if (n <= 1) return 1; else return n * (n - 1);}int fact(int n){ TestFact t; return t.fact(n);}PyObject* wrap_fact(PyObject* self, PyObject* args){ int n, result; if (! PyArg_ParseTuple(args, "i:fact", &n)) return NULL; result = fact(n); return Py_BuildValue("i", result);}static PyMethodDef exampleMethods[] ={ {"fact", wrap_fact, METH_VARARGS, "Caculate N!"}, {NULL, NULL}};extern "C" //不加会导致找不到initexamplevoid initexample(){ PyObject* m; m = Py_InitModule("example", exampleMethods);}把这段代码存为wrapper.cpp, 编成so库,g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config然后在有此so库的目录, 进入python, 可以如下使用import exampleexample.fact(4)3. Python 调用 C++ (Boost.Python)Boost库是非常强大的库, 其中的python库可以用来封装c++被python调用, 功能比较强大, 不但可以封装函数还能封装类, 类成员./Program/Abstract/Building%20Hybrid%20Systems%20with%20Boost_Python.CHN.by.JERRY.htm首先在ubuntu下安装boost.python, apt-get install libboost-python-dev#include char const* greet(){ return "hello, world";}BOOST_PYTHON_MODULE(hello){ using namespace boost::python; def("greet", greet);}把代码存为hello.cpp, 编译成so库g++ hello.cpp -o hello.so -shared -I/usr/include/python2.5 -I/usr/lib/python2.5/config -lboost_python-gcc42-mt-1_34_1此处python路径设为你的python路径, 并且必须加-lboost_python-gcc42-mt-1_34_1, 这个库名不一定是这个, 去/user/lib查然后在有此so库的目录, 进入python, 可以如下使用>>> import hello>>> hello.greet()'hello, world'4. python 调用 c++ (ctypes)ctypes is an advanced ffi (Foreign Function Interface) package for Python 2.3 and higher. In Python 2.5 it is already included.ctypes allows to call functions in dlls/shared libraries and has extensive facilities to create, access and manipulate simple and complicated C data types in Python - in other words: wrap libraries in pure Python. It is even possible to implement C callback functions in pure Python.boBox上选择"包含文件”,添加python的include目录(我的机器上是"F:\Program

Files\Python25\include"),然后选择库文件,添加python的libs目录(我的机器上是"F:\Program Files\Python25\libs")。

既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码:

#include <python.h> //python.h是包含python一些定义的头文件,在python的include目录下 /*

我的python版本是2.5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll,

想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息

译为,python

3.如何让python调用C和C++代码

如何让python调用C和C++代码 安装python后,会有一个chm格式的python手册。

要搞明白如何让python调用C/C++代码(也就是写python的 extension),你需要征服手册中的<>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他 书籍,最终在<>书中找到了教程。

下面记录一下如何在visual studio 2005中,写一段C/C++的MessageBox代码,然后提供后python调用,最后的结果当然是显示一个MessageBox. 1. 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个 dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:\Program Files\Python25\DLLs),假如我们接下来要写的扩展module名为mb,python调用的代码为: import mb mb.showMsg("Python's really amazing, I kindda love it!") python怎么找到我们的mb模块呢?就是上面说的,我们要生成一个mb.dll,然后拷贝到Dlls目录下面,为了区别普通的dll和python专用扩展的dll,我们的 mb.dll修改成mb.pyd(python dll) 2. 搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。 在vs 2005下点击菜单 "工具"->"选项", 打开选项对话框,选择"项目和解决方案->VC++目录", 然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:\Program Files\Python25\include"),然后选择库文件,添加python的libs目录(我的机器上是"F:\Program Files\Python25\libs")。

既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码: #include //python.h是包含python一些定义的头文件,在python的include目录下 /* 我的python版本是2.5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll, 想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息*/ #pragma comment(lib, "python25.lib") //先不管 static PyObject* mb_showMsg(PyObject* self, PyObject *args); /* 如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用 initmb函数,这个函数告诉python我们有些什么函数,该怎么告诉python我们有一个showMsg函数呢?下面详解 */ //必须extern "C"下,这样不会在C++编译器里不会更改掉导出的函数名字,我第一次就犯了这样的错误 extern "C" __declspec(dllexport) void initmb() { /* 当调用mb.showMsg("Python's really amazing, I kindda love it!")时, 相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式, 定义一个字典数据结构,key => showMsg, value =>mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧 */ static PyMethodDef mbMethods[] = { {"showMsg", mb_showMsg, METH_VARARGS}, {NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/ }; //告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里 PyObject *m = Py_InitModule("mb", mbMethods); } /* 接下来实现核心功能showMsg */ //第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple static PyObject* mb_showMsg(PyObject* self, PyObject *args) { //我们的showMsg函数需要的是一个字符串参数 const char* msg = NULL; /*调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址, 如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址, 这个函数的原型是类似printf的不定参数的形式 PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, 。); */ if (!PyArg_ParseTuple(args, "s", &msg)) return NULL; //调用MB int r = ::MessageBox(NULL, "hello", "Caption:Form C module", MB_ICONINFORMATION | MB_OK); //返回值 return Py_BuildValue("i", r); } 将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码: import mb mb.showMsg("Python's really amazing, I kindda love it!") 可以看到弹出来一个MessageBox。

python编译为c

转载请注明出处代码入门网 » python编译为c(python调用c函数)

资讯

python字典添加值(python怎么给字典添加一对值)

阅读(20)

本文主要为您介绍python字典添加值,内容包括python怎么给字典添加一对值,python如何对字典的值添加元素?,Python:如何将字典中的值写入文件?。如果只是添加一次,>>> l = [01, 张三]>>> dic = {}>>> dic[l[0]] = l[1] 如果有大量的这种二元

资讯

pythonidle快捷键(python运行快捷键是什么)

阅读(26)

本文主要为您介绍pythonidle快捷键,内容包括Mac版的PythonIDEL,按什么快捷键可以快速显示上一条命令,下一,python运行快捷键是什么,pythonidle怎么清屏快捷键。Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用

资讯

python标准库中文版pdf(学习Python语言,,入门的教科书)

阅读(24)

本文主要为您介绍python标准库中文版pdf,内容包括python初学者,求专业的人提供一本比较好的入门书籍万分感谢!,学习Python语言,,入门的教科书请您给推荐几本,python标准库?。推荐:像计算机科学家一样思考PythonPython编程实践Python核心编程

资讯

python算法精解pdf(如何实现用python处理pdf)

阅读(23)

本文主要为您介绍python算法精解pdf,内容包括如何实现用python处理pdf,python怎样读取pdf文件的内容,python的数学计算。python是一款应用非常广泛的脚本程序语言,谷歌公司的网页就是用python编写。python在生物信息、统计、网页制作、计算

资讯

python圣经(西方有关龙的传说)

阅读(24)

本文主要为您介绍python圣经,内容包括堕天使的九个天使叫啥,都是什么天使,学习python有什么好的书籍,python深度学习的学习方法或者入门书籍有什么。龙在西方文化中也是常见的。然而,与中华文化大相径庭的是,西方文化中往往把龙(dragon)视为邪

资讯

python3.5转exe(python3.6的py文件可以直接生成exe文件吗)

阅读(27)

本文主要为您介绍python3.5转exe,内容包括如何将python3.5程序打包为exe,vs2015中的python3.5怎么生成exe,python3.6的py文件可以直接生成exe文件吗。python的.py文件是无法自动生成.exe文件的.需要用其他工具实现:py2exe是一个将python脚本

资讯

python2.7安装pyqt5(pyqt5支持python2.7吗)

阅读(25)

本文主要为您介绍python2.7安装pyqt5,内容包括pyqt5支持python2.7吗,pyqt5支持python2.7吗,python2可以用pyqt5吗。支持当前Deadline7版本使用的是Python2.7+Qt5作为框架,来进行的开发,为了与之配合,做定制项目开发的时候,也需要同样的

资讯

linuxpython默认版本号(python2.4对应linux哪个版本)

阅读(17)

本文主要为您介绍linuxpython默认版本号,内容包括linux哪个版本python,python在Linux下已经到什么版本了,ubuntu上怎么设置与切换默认python版本。第一步:下载python2.7.4版本源码:wget http://python.org/ftp/python/2.7.4/Python

资讯

python3.5web.py(python3.5里面怎么搭建简单的web服务器)

阅读(18)

本文主要为您介绍python3.5web.py,内容包括python3.5里面怎么搭建简单的web服务器,如何给python安装web.py框架,如何给python安装web.py框架。python3.5里面怎么搭建简单的web服务器利用Python自带的包可以建立简单的web服务器。在DOS里cd

资讯

pythonnormalvariate(如何用python生成lognormaldistribution)

阅读(19)

本文主要为您介绍pythonnormalvariate,内容包括python怎样生成正态分布的随机数,python求正态分布的随机数,python如何产生01正态分布的随机数?。numpy.random包可以实现这一功能。numpy包是python的一种开源的数值计算扩展。这种工具可用

资讯

pythonemail模块详解(python怎么添加email模块)

阅读(22)

本文主要为您介绍pythonemail模块详解,内容包括python怎么添加email模块,pythonemail模块中formataddr的作用,python正则表达式分析文本文件中所有的email地址。python 怎么添加pygal模块R的主要优势是它有一个庞大的社区,通过邮件列表,用户

资讯

python字典添加值(python怎么给字典添加一对值)

阅读(20)

本文主要为您介绍python字典添加值,内容包括python怎么给字典添加一对值,python如何对字典的值添加元素?,Python:如何将字典中的值写入文件?。如果只是添加一次,>>> l = [01, 张三]>>> dic = {}>>> dic[l[0]] = l[1] 如果有大量的这种二元

资讯

pythonidle快捷键(python运行快捷键是什么)

阅读(26)

本文主要为您介绍pythonidle快捷键,内容包括Mac版的PythonIDEL,按什么快捷键可以快速显示上一条命令,下一,python运行快捷键是什么,pythonidle怎么清屏快捷键。Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用

资讯

python标准库中文版pdf(学习Python语言,,入门的教科书)

阅读(24)

本文主要为您介绍python标准库中文版pdf,内容包括python初学者,求专业的人提供一本比较好的入门书籍万分感谢!,学习Python语言,,入门的教科书请您给推荐几本,python标准库?。推荐:像计算机科学家一样思考PythonPython编程实践Python核心编程

资讯

python算法精解pdf(如何实现用python处理pdf)

阅读(23)

本文主要为您介绍python算法精解pdf,内容包括如何实现用python处理pdf,python怎样读取pdf文件的内容,python的数学计算。python是一款应用非常广泛的脚本程序语言,谷歌公司的网页就是用python编写。python在生物信息、统计、网页制作、计算

资讯

python圣经(西方有关龙的传说)

阅读(24)

本文主要为您介绍python圣经,内容包括堕天使的九个天使叫啥,都是什么天使,学习python有什么好的书籍,python深度学习的学习方法或者入门书籍有什么。龙在西方文化中也是常见的。然而,与中华文化大相径庭的是,西方文化中往往把龙(dragon)视为邪

资讯

python3.5转exe(python3.6的py文件可以直接生成exe文件吗)

阅读(27)

本文主要为您介绍python3.5转exe,内容包括如何将python3.5程序打包为exe,vs2015中的python3.5怎么生成exe,python3.6的py文件可以直接生成exe文件吗。python的.py文件是无法自动生成.exe文件的.需要用其他工具实现:py2exe是一个将python脚本

资讯

python写登录脚本(如何使用Python编写自动登录的脚本)

阅读(23)

本文主要为您介绍python写登录脚本,内容包括如何使用Python编写自动登录的脚本,python自动登录CSDN的脚本怎么实现?,如何用python写一个安卓app自动登录代码。#!/usr/bin/expect -fset password 12345678spawn ssh name@###.###.###e

资讯

pythontwisted广播(局域网如何互连?)

阅读(1)

本文主要为您介绍pythontwisted广播,内容包括pythonPyTorch用matmul写矩阵相乘函数时,怎么让函数可以广播?,局域网如何互连?,学习python能干什么???。网络互连的目的:是将多个网络互相连接,以实现在更大范围内的信息交换资源共享和协同工作。

资讯

python精要参考pudn(python四种基本数据类型)

阅读(1)

本文主要为您介绍python精要参考pudn,内容包括python四种基本数据类型,要学习python需要学习哪些知识?,零基础如何开始学习Python?如何入门?。python是相当高级的语言,基本数据类型就很多,不过参考其他语言的,一定要四个的话:整形 int定义:age=1

资讯

python百分数加减(python如何进行多项式的加减乘除)

阅读(2)

本文主要为您介绍python百分数加减,内容包括python中,如何计算变量与百分数的结果?,python如何进行多项式的加减乘除,扩句(有要求)将下面的句子扩展成一句话,。如何进行多项式的加减乘除?这个题目太大!12个字,写出来很简单,答案却是初中教材上

资讯

wsgipython开发(如何创建部署WSGI类型的Python应用)

阅读(2)

本文主要为您介绍wsgipython开发,内容包括如何创建部署WSGI类型的Python应用,如何创建部署WSGI类型的Python应用,如何部署pythonweb程序。第一部分:安装必要工具。1.因为这是部署Python开发环境,所以安装pip可以简化一些软件的安装过程。(PIP

资讯

python集成测试框架(最受欢迎的Python开源框架有哪些)

阅读(1)

本文主要为您介绍python集成测试框架,内容包括最受欢迎的Python开源框架,企业级软件开发需要什么样的框架,Python企业应用到底如何?。Django: Python Web应用开发框架Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。D

资讯

python数据驱动测试(python中什么是测试数据和训练数据)

阅读(1)

本文主要为您介绍python数据驱动测试,内容包括python中什么是测试数据和训练数据,python学到什么程度就能满足测试需要,如何用python抓取js生成的数据:。当数据量特别大的时候,有几千几万条,为了验证模型的好坏,取出一部分用于训练,另一部分用

资讯

python函数返回值为list(返回值是一个list的函数,该怎么写)

阅读(1)

本文主要为您介绍python函数返回值为list,内容包括python设计一个名为listsum的函数,接收一个数字的列表,返回积累,python函数如何返回多个变量,c/c++调用python中返回值为list的函数。1.你先定义个实体类(当中的字段要跟table里一一对应,类

资讯

pythondatetime相加(python中datetime怎么用)

阅读(1)

本文主要为您介绍pythondatetime相加,内容包括python时间相加函数,python中datetime怎么用,python获取系统时间有问题(时区?)写了一段python代码。 日期相关的操作 from datetime import datetime from datetime import timedel