使用C语言编写Python扩展包
时间:2022-07-22
本文章向大家介绍使用C语言编写Python扩展包,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用C编写Python扩展包。官网文档其实已经很详尽~ 使用场景猜想:某些需要高效处理的算法、某些耗时的操作优化、或者某些核心算法加密等~
环境:macOS + pyhton3.7
文档地址:
- https://docs.python.org/3/extending/index.html
- https://packaging.python.org/tutorials/packaging-projects/
整体结构
➜ strings_pkg git:(master) tree
.
├── LICENSE
├── README.md
├── setup.py
└── strings_pkg
├── __init__.py
└── strings.c
1 directory, 5 files
扩展模块 strings.c
//
// Created by lpe234 on 2018/12/27.
//
// doc: https://docs.python.org/3/extending/extending.html
#include <Python.h>
/**
* reverse
* 实际执行函数
*
* @param str
* @param size
*/
void reverse(char *str, int size) {
for (int i = 0, j = size-1; i < j ; ++i, --j) {
char tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
/**
* 对函数进行封装
*
* @param self
* @param args
* @return
*/
PyObject *
strings_reverse(PyObject *self, PyObject *args) {
char *str;
// 参数解析
if (!PyArg_ParseTuple(args, "s", &str)) {
return NULL;
}
// 调用 reverse
reverse(str, (int) strlen(str));
return Py_BuildValue("s", str);
}
/**
* 定义模块方法表
*
*/
static PyMethodDef StringsMethods[] = {
{"reverse", strings_reverse, METH_VARARGS, "Reverse str."},
{NULL, NULL, 0, NULL}
};
/**
* 定义模块
*
*/
static struct PyModuleDef stringsmodule = {
PyModuleDef_HEAD_INIT,
"strings",
"reverse str, "abc" => "cba"",
-1,
StringsMethods
};
/**
* 模块初始化
*
* @return
*/
PyMODINIT_FUNC
PyInit_strings(void) {
return PyModule_Create(&stringsmodule);
}
安装模块 setup.py
import setuptools
with open('README.md', 'r') as fh:
long_description = fh.read()
strings_module = setuptools.Extension('strings',
sources=['strings_pkg/strings.c'],
language='c')
setuptools.setup(
name="strings_pkg",
version="0.0.1",
author="lpe234",
author_email="lpe234@qq.com",
description="string extension package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/lpe234/strings_pkg",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
ext_modules=[strings_module]
)
上传至pypi仓库
➜ twine upload dist/*
体验
➜ ~ pip3 install strings-pkg
Collecting strings-pkg
Downloading https://files.pythonhosted.org/packages/f9/30/d9324783ef220de473b8fac550029c43ef2a8b7c26a16a3881ae6c8d006a/strings_pkg-0.0.1-cp37-cp37m-macosx_10_14_x86_64.whl
Installing collected packages: strings-pkg
Successfully installed strings-pkg-0.0.1
➜ ~ python3
Python 3.7.1 (default, Nov 28 2018, 11:51:47)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import strings
>>> strings.reverse('hello world')
'dlrow olleh'
>>>
- React-Native组件之 Navigator和NavigatorIOS
- JDK容器学习之Queue:ConcurrentLinkedQueue
- JDK容器学习之Queue: PriorityQueue
- React Native导航器之react-navigation使用
- Nginx 路由转发配置笔记
- React Native控件之ListView
- Java学习之深拷贝浅拷贝及对象拷贝的两种方式
- [周末课程]什么是“页面业务流程”分析思维导图?如何编写页面假JSON数据? &下一个前端组件“日历”
- Java并发学习之玩转线程池
- Java & PhantomJs 实现html输出图片
- 干货 | React Native实践之携程Moles框架
- Java并发学习之ThreadLocal使用及原理介绍
- ibeacon蓝牙技术简介
- Java并发学习之定时任务的几种玩法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter Dojo设计之道——骚气的闪屏动画是如何实现的
- 数据处理 | pandas入门专题——离散化与one-hot
- 聊聊dubbo-go的failfastCluster
- 一分钟学Python|Python的循环语句
- OpenCV4.4 中SIFT特征匹配调用演示
- 这些Python库虽然冷门,但功能真的很强大!
- SQL查找是否"存在",别再count了,很耗费时间的
- 采用 Vue 编写的功能强大的 Swagger-ui 页面
- SQL 计算中位数
- SQL 打印成绩单
- TypeScript 快速入门
- ES的新特性
- PHP设计模式|观察者模式
- JavaScript 中 this 的错误认识、绑定规则、常见问题讲解
- 实践:SpringBoot实现定时任务的动态增删启停