注意。此方式只在win下用vc2008成功。其他编译器/环境未试验:

1。 在vc中建立一个dll的project。 假定我们的module的名字是mytest.那么我们的dll名字就是mytest.dll。 这个是必须的。

2。 用c写我们想要实现的部分。步骤如下

#include //这个是必须的。python的类型都在这里定义。

static PyObject* my_strlen(PyObject *self, PyObject *args)

{char *string;intlen;if (!PyArg_ParseTuple(args, "s", &string))returnNULL;

len= strlen(string);return Py_BuildValue("i", len);

}static PyObject* my_strcat(PyObject *self, PyObject *args)

{char*string1;char*string2;char*newstring;if (!PyArg_ParseTuple(args, "s|s", &string1, &string2))returnNULL;

newstring=strcat(string1, string2);return Py_BuildValue("s", newstring);

}

第一个参数是self,这个是python用的, 每个函数都要有。我们暂时不管。args是一个参数列表。她把所有的参数都整合成一个string。所以

我们需要从这个string里来解析我们的参数。

PyArg_ParseTuple来完成这个任务。第一个参数是args, 就是我们要转换的参数。第二个是格式符号。"s”代表是个string。 从args里

提取一个参数就写"s", 两个的话就写"s|s", 如果是一个string,一个int,就写"s|i", 和printf差不多。第三个参数就是提取出来的

参数放置的真正位置。必须传递这个参数的地址。对于my_strcat, 他将提取两个参数。分别是string1和string2。

然后调用真正的我们的实现。分别是strlen和strcat。

调用完之后我们需要返回结果。这个结果是c的type或者是我们自己定义的类型。必须把他转换成PyObject, 让python认识。这个用Py_BuildValue

来完成。他是PyArg_ParseTuple的逆过程。他的第一个参数和PyArg_ParseTuple的第二个参数一样, 是个格式化符号。第三个参数

是我们需要转换的参数。Py_BuildValue会把所有的返回只组装成一个tutple给python。

实际上,我们只是把我们想要实现的部分调用python提供的api来封装了一下。但是python并不知道怎么用这些函数。

我们还需要做一些工作。

static PyMethodDef mytestMethods[] ={

{"mystrlen", my_strlen, METH_VARARGS, "We test strlen of C"},

{"mystrcat", my_strcat, METH_VARARGS, "We test strcat of C"},

{NULL, NULL,0, NULL}

};

这个是一个c的结构。他来完成一个映射。 我们需要把我们扩展的函数都映射到这个表里。表的第一个字段是python真正认识的。是python

里的方法名字。 第二个字段是python里的这个方法名字的具体实现的函数名。 在python里调用mystrlen, 真正执行的是用c写的

my_strlen函数。第三个字段是METH_VARARGS, 他告诉python,mystrlen是调用c函数来实现的。第四个字段是这个函数的说明。如果你在

python里来help这个函数,将显示这个说明。相当于在python里的函数的文档说明。

我们建立了这个映射表。这个表是在python导入我们的这个module的时候来用的。

/*下面就和2.x版本的约定不同了*/

static PyMethodDef mytestMethods[] ={

{"mystrlen", my_strlen, METH_VARARGS, "We test strlen of C"},

{"mystrcat", my_strcat, METH_VARARGS, "We test strcat of C"},

{NULL, NULL,0, NULL}

};char name[] = "mytest";staticPyModuleDef mytestModule;//对于其他平台。函数的修饰符可能不同

_declspec(dllexport)voidPyInit_mytest()

{

mytestModule.m_methods= mytestMethods;//模块的方法表

mytestModule.m_name = name;//模块说明

PyModule_Create2(&mytestModule, PYTHON_API_VERSION);

}

注意,这个函数的名字不能改动。 必须是PyInit_+模块名字。 我们的模块名字是mytest。所以这个函数是PyInit_mytest()。 这个函数应该被 导出。所以使用 _declspec(dllexport)。 这样python在导入mytest 的模块时候,才会找到这个函数,并调用。

a. 当我们import mytest的时候。 python装载这个module的dll。 在这里是mytest.dll

b. 然后在这个dll里调用, PyInit_mytest函数来建立一个映射表。 如果这个initmytest函数不实现或者没有导出。就不能成功把这个module

导入到python里。

c. python 从映射表 知道这个模块实现了几个方法。并且名字分别是什么。当调用他们的时候,找到相应的c的函数。

写完这些代码以后,我们可以在vc里编译这个dll, 注意,必须编译成release版本。编译的dll名字是mytest.dll。如果不是的话,在vc里改动link的设置。

把mytest.dll改名为mytest.pyd,然后拷到python3的DLLs目录下

#test.py 测试代码

import mytest

print(mytest.mystrlen("123") )

print(mytest.mystrcat("123", "456"))

应该输出:

3

123456

python用什么来写模块-Python 3.1 用C写模块 扩展(序)相关推荐

  1. python用什么来写模块-Python常用模块——模块介绍与导入

    Python常用模块--模块介绍与导入 一.什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分 ...

  2. 手把手教你自己写一个Python模块,并将其发布并安装到自己的Python环境中去

    首先得说明一点,python的模块就是有一些.py文件所构成的,所以要想写一个模块,自己得先写一些python程序,我这里就写一个module1.py 1.接下来,就是先建立一个文件夹my_packa ...

  3. python根目录_每日一练(22)-自己写一个python模块并发布到本机环境

    1.新建目录saycolor-demo mkdir saycolor-demo 2.新建setup.py,内容如下 from packages指定需要导入的python包 3.新建saycolor包, ...

  4. 路由器运行python脚本_写个Python脚本来登录小米路由器

    这个脚本写起来难度并不是很大,博主还是一步步的分析下,这样思路会比较清晰,下次遇到类似系统脚本写起来也更快速.好了,一起来分析分析. 首先看下小米路由器的登录界面 可以看到只需要输入密码即可登录,博主 ...

  5. 给老婆写个Python教程

    作者 | 水风 来源 | 水风知乎问答 如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_source=csdn_bw 什么是code code就是 ...

  6. 打包可执行包_想把你写的Python程序发给别人用?打包成exe啊!

    前言 大家好,欢迎来到编程教室! 当你学了一段时间Python,终于写出一个小游戏的时候,是不是很想发给你的小伙伴分享一下你的成果?但是,如果直接将xx.py文件发给别人,别人通常是不能直接运行的,他 ...

  7. matlab模块 python,Matlab 和Python结合使用

    今天介绍的内容比较基础,希望能达到抛砖引玉的效果. Matlab 和 Python 结合使用无非分为两种情形: Matlab中使用Python包: Python中使用Matlab. 1. Matlab ...

  8. python读文件写文件-python 文件读写操作

    读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件 ...

  9. python恶搞小程序-知道了这个,你也能写出 Python 趣味小程序

    原标题:知道了这个,你也能写出 Python 趣味小程序 前两天在 51CTO 看见某篇推荐博文,大概是一个 豆子比较感兴趣,在知乎和 github 上搜索了相关的源代码,发现原来实现起来非常的简单, ...

最新文章

  1. HDU - 2181-哈密顿绕行世界问题
  2. 在leangoo项目里怎么批量导入成员,更改项目成员权限,移除项目成员?
  3. 用Java调用WebService
  4. [react] 怎样将多个组件嵌入到一个组件中?
  5. opencv生成日志_OpenCV在Android环境下的使用方法
  6. Pv6报头结构以及与IPv4的比较
  7. 巧设IP路由 实现不同网段互通
  8. HISI3536安装交叉编译工具链
  9. (转)《精通比特币》原码分析: pow机制
  10. STM32接收红外遥控数据
  11. 计算机c类论文什么水平,国内B类论文一般是什么级别
  12. python使用www.ip138.com作为解析对象 获取公网ip及ip所属地区
  13. 批处理学习(一)——MS-DOS命令
  14. 深度学习-核对矩阵维度
  15. 你的年龄体重身高,最好别对这款 app 撒谎
  16. JQuery下拉框与复选框
  17. 【光耦 Normalized...和 CTR 测试条件及测试曲线 解读 : PC817和LTV-1007-TP1-G】
  18. 看我解决Linux下的OTG切换问题
  19. java 日期calendar_java成神之——date和calendar日期的用法
  20. 为什么手机计算机打不开怎么办,word打不开怎么解决,手机word打不开怎么办

热门文章

  1. 零起点英语_【零起点英语】第154讲:Large Feet 大脚丫
  2. Adobe Edge Animate 1.0 概述
  3. bzoj 3670 [NOI2014]动物园
  4. Android开发之万能适配器
  5. CentOS6编译装载nbd模块
  6. ADO.NET 基础知识
  7. Bailian2854 点和正方形的关系【水题】
  8. POJ2139 Six Degrees of Cowvin Bacon【Floyd算法】
  9. 太原理工大学ICPC队介绍(2020版)
  10. POJ3981 字符串替换【水题】