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模块的更多相关文章

  1. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  2. 扩展Python模块系列(四)----引用计数问题的处理

    承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...

  3. 扩展Python模块系列(五)----异常和错误处理

    在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...

  4. 扩展Python模块系列(三)----参数解析与结果封装

    在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...

  5. 扩展Python模块系列(一)----开发环境配置

    本系列将介绍如何用C/C++扩展Python模块,使用C语言编写Python模块,添加到Python中作为一个built-in模块.Python与C之间的交互目前有几种方案: 1. 原生的Python ...

  6. 使用C语言扩展Python提供性能

    python底层是用c写的,c本身是一个非常底层的语言,所以它做某些事情的效率肯定会比上层语言高一些. 比如有些自动化测试用的python库,会对系统的UI进行一些捕获,点击之类的操作,这必然要用到c ...

  7. 使用C语言扩展Python

    开发环境:Ubuntu9.10,python2.6,gcc4.4.1 1,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用 ...

  8. 用C语言扩展Python的功能

    https://www.ibm.com/developerworks/cn/linux/l-pythc/

  9. 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments

    使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...

随机推荐

  1. 【python网络编程】使用rsa加密算法模块模拟登录新浪微博

    一.基础知识 http://blog.csdn.net/pi9nc/article/details/9734437 二.模拟登录 因为上学期参加了一个大数据比赛,需要抓取数据,所以就想着写个爬虫抓取新 ...

  2. linux之awk、sed命令

    总结: 两个命令的正则表达式都用''单引号进行区分. 输出变量名用单引号,输出变量值用双引号,这个在bash脚本里一般是通用的. 在bash脚本里要使用变量值,都要加上双引号 awk用法: 参考网址: ...

  3. 关于outerWidth()属性

    在写代码的时候,获取元素的宽度通常用到这个属性.此属性具有如下特点: 1.默认情况下,它的值为所有后代元素(含此元素本身)中最大的宽度值. 2.若某后代元素的display属性为none,那么在计算的 ...

  4. 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)

    解析一个从淘宝传递的JSON (大家如有兴趣可以测试下):{ "tae_item_detail_get_response": { "data": { " ...

  5. 剑指Offer 左旋转字符串

    题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...

  6. C语言文件操作

    C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...

  7. OS X 添加环境变量

    这个方法相对靠谱,可用: 1, cd 到home 2, touch .bash_profile 3,open -e .bash_profile 把各个路径按如下填写: export PATH=${PA ...

  8. idea修改默认快捷键

    点击file ,选择settings. 输入keymap: 因为多数人使用的都是eclipse,比较容易上手,习惯了eclipse的键位,如 此就能更换. 也可以在对应的操作上,设置自己熟悉的键位.

  9. django debug

    django_debug_toolbar(略). debug toolbar还不够用,看下面. 1. 在对应的位置设置断点 import pdb pdb.set_trace() 2. runserve ...

  10. [转]Python的ASCII, GB2312, Unicode , UTF-8

    2007-12-13 10:50:47|  分类: Python实用软件编|举报|字号 订阅     ASCII 是一种字符集,包括大小写的英文字母.数字.控制字符等,它用一个字节表示,范围是 0-1 ...