C语言扩展Python模块
1. 先创建一个PythonDemo.cpp文件:
//c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \ C/C++中调用python文件。
#include "Python.h"
然后定义一个模块的初始化函数
PyMODINIT_FUNC initlc_hello_world(void)
{
Py_InitModule("lc_hello_world",lc_hello_world_methods);
}
这个函数是用于模块初始化的,即是在第一次使用import语句导入模块时会执行。其函数名必须为initmodule_name这样的格式,在这里我们的模块名为lc_hello_world,所以函数名就是initlc_hello_world。
在这个函数中又调用了PyInitModule函数,它执行了模块的初始化操作。Py_InitModule函数传入了两个参数,第一个参数为字符串,表示模块的名称;第二个参数是一个Py_MethodDef的结构体数组,表示该模块都具有哪些方法。因此在initlc_hello_world方法之前还需要先定义lc_hello_world_methods数组。
static PyMethodDef lc_hello_world_methods[]=
{
{"test",test_function,METH_VARARGS,"lc_hello_world extending test"},
{NULL,NULL,0,NULL}
};
PyMethodDef结构体有四个字段。
第一个是字符串,表示在Python文件中对应的方法的名称;
第二个是对应的C代码的函数名称;
第三个是一个标志位,表示该Python方法是否需要参数,METH_NOARGS表示不需要参数,METH_VARARGS表示需要参数;
第四个是一个字符串,它是该方法的__doc__属性,这个不是必须的,可以为NULL。
PyMethodDef结构体数组最后以{NULL,NULL,0,NULL}结尾。
C代码实现lc_hello_world_methods中定义的test_function函数:
PyObject* test_function(PyObject *self,PyObject *args)
{
PyObject *pObject = NULL;
int nThread = 0;
int nCalcData = -1;
int isDebug = 0,isCalcHis = 0;
if(!PyArg_ParseTuple(args,"oiii",&pObject,&nThread,&nCalcData,&isDebug,&isCalcHis))
{
PyErr_Print();
return NULL;
}
return Py_True;
}
编译:
扩展模块编写完成后,接下来就是对其进行编译了。先写一个setup.py脚本:
from setuptools import setup,Extension
hello_world = Extension('lc_hello_world',sources=['PythonDemo.py'])
setup(ex_modules=[hello_world])
然后执行命令进行编译:
python setup.py build
如果报错,得先安装setuptools,步骤如下:
1.下载ez_setup.py到某一个目录(如: e:\tools\ez_setup.py)下载地址: https://bootstrap.pypa.io/ez_setup.py
2.cmd进入e:\tools,运行python ez_setup.py
setuptools安装完毕之后:
将setup.py拷贝至PythonDemo.cpp文件目录下;
再执行python setup.py build

项目加载上面生成的lib之后:
PythonDemo.cpp中测试模块是否可用:
Py_InitModule("lc_hello_world",lc_hello_world_methods);
//c语言扩展python
//执行start函数
pFunc = PyObject_GetAttrString(pModule,"Start");
pArg = Py_BuildValue("(s)","hello xiaochun");//随便传一个元组
PyEval_CallObject(pFunc,pArg);//使lc_hello_world.test映射到test_function()函数


Demo.py

Demo程序:
百度云(13207134391):
CC++中调用Python\PythonDemo
C语言扩展Python模块的更多相关文章
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
- 扩展Python模块系列(四)----引用计数问题的处理
承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...
- 扩展Python模块系列(五)----异常和错误处理
在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...
- 扩展Python模块系列(三)----参数解析与结果封装
在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...
- 扩展Python模块系列(一)----开发环境配置
本系列将介绍如何用C/C++扩展Python模块,使用C语言编写Python模块,添加到Python中作为一个built-in模块.Python与C之间的交互目前有几种方案: 1. 原生的Python ...
- 使用C语言扩展Python提供性能
python底层是用c写的,c本身是一个非常底层的语言,所以它做某些事情的效率肯定会比上层语言高一些. 比如有些自动化测试用的python库,会对系统的UI进行一些捕获,点击之类的操作,这必然要用到c ...
- 使用C语言扩展Python
开发环境:Ubuntu9.10,python2.6,gcc4.4.1 1,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用 ...
- 用C语言扩展Python的功能
https://www.ibm.com/developerworks/cn/linux/l-pythc/
- 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments
使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...
随机推荐
- MYSQL基础语句
参考书籍< MySQL数据库基础与实例教程> --孔祥盛 SQL(structured query language)结构化查询语言,应用最为广泛的关系型数据库语言. MYSQL属于关系型 ...
- Mac os壁纸提取
想必用过Mac os系统的朋友都知道mac壁纸,提取出来用作壁纸是十分好看的 下面给出壁纸的位置,自己用文件管理器打开然后复制出来即可! 系统盘:/Library/DesktopPictures
- Redis学习笔记十:独立功能之监视器
通过执行 monitor 命令可以让客户端自己变成一个监视器,实时接收并打印当前处理的命令请求的相关信息. 127.0.0.1:6379> monitor OK 1451752646.83727 ...
- 实现Android的不同精度的定位(基于网络和GPS)
解决方案: 实现Android的不同精度的定位(基于网络和GPS) Android中的定位服务的相关类基本上都在android.location包中,其中位置服务管理器(LocationManager ...
- Codeforces 260 B. Fedya and Maths
题目链接:http://codeforces.com/contest/456/problem/B 解题报告:输入一个n,让你判断(1n + 2n + 3n + 4n) mod 5的结果是多少?注意n的 ...
- CAniamtion 基本使用
CAAnimation(抽象)<NSCoding, NSCopying, CAMediaTiming, CAAction> QuartzCore框架的基本继承结构 -> CATran ...
- 跟着百度学PHP[4]OOP面对对象编程-4-对象成员的访问 ->
使用一个减号一个尖括号->来达到访问对象成员. $object->方法 来看案例. <?php class Person{ private $name; "; var $s ...
- centos: vmware 安装centos 7连不上网
在vmware上安装centos 7时,安装完成后无法连接网络,通过搜索查找原来是有线网卡没有激活,默认情况下centos和redhat都不启用有线网卡,只能手动开启或者安装时直接启用. 1.进入命令 ...
- Tomcat无法启动问题
检查环境变量设置 再打开一个cmd, 1.输入if not exist "%JRE_HOME%\bin\java.exe" echo no jre java 回车 结果:no ...
- CCF 模拟C 找最大矩形+输入输出外挂
http://115.28.138.223:81/view.page?opid=3 统计出连续的最长乘以当前高度,找最大即可 #include<iostream> #include< ...