使用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'
>>>
- 跨网络拷贝文件的简单实践(r3笔记第67天)
- 关于enq: TX - allocate ITL entry的问题分析(r3笔记第66天)
- Tensorflow学习:使用Tensorflow搭建深层网络分类器
- 关于interval partitioning(r3笔记65天)
- Spark Tips4: Kafka的Consumer Group及其在Spark Streaming中的“异动”(更新)
- 关于数据库中的一些name(r3笔记第64天)
- 码农的瑞士军刀-脚本语言
- shell基础学习总结(一) (r3笔记第63天)
- 关于sysdba,sysoper,dba的区别(r3笔记第62天)
- 使用句柄实现特定场景的无备份恢复 (r3笔记第61天)
- 关于dual表的破坏性测试(r3笔记第60天)
- 哈希现金(Hashcash)与“工作量证明”
- 关于oracle中的sql数据类型(r3笔记第59天)
- 使用awr来分析sesson leak问题(r3笔记第78天)
- 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 数组属性和方法