文档章节

使用C语言编写Python扩展包

明天以后
 明天以后
发布于 2018/12/27 18:14
字数 459
阅读 21
收藏 3

使用C编写Python扩展包。官网文档其实已经很详尽~ 使用场景猜想:某些需要高效处理的算法、某些耗时的操作优化、或者某些核心算法加密等~

环境:macOS + pyhton3.7

文档地址:

整体结构

➜  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'
>>>

© 著作权归作者所有

明天以后

明天以后

粉丝 76
博文 130
码字总数 87367
作品 0
昌平
程序员
私信 提问
Python的C/C++扩展——Python的C语言接口

文章首发于我的技术博客:你可以在上面看到更多的Python教程和python爬虫 Python语言最初是用C语言实现的一种脚本语言,后来被称为CPython,是因为后来又有其它语言实现的Python,比如Pytho...

呆木木人儿
2019/03/11
97
0
深入了解Python与黑客的关系,另赠Python黑客视频教程!

网络爱好者总是要掌握编程语言的,这里推荐:python。下面,一文了解黑客们会用到哪些Python技术!尾部免费送教程! 1、为什么是python Python已经成为漏洞开发领域的行业标准,读者会发现大...

Python新世界
2018/07/27
0
0
黑客们会用到哪些Python技术?

文 / Python全家桶 目录 1. 环境配置 2. 安装依赖包 3. 与网络交互 4. 二进制操作或编码 5. 漏洞开发工具 Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Pytho...

程序员之家_
2019/03/03
0
0
Python是什么?简单了解pythonp-入门

简单了解python Python语言特色 Python是一门解释性语言 解释性语言:在系统中运行时需要使用解释器(如:php、java) 编译性语言:在系统中运行不需要解释器,可以直接运行(如:C、C++) ...

1229747455418890
2019/02/23
0
0
C/C++ 和 Python混合编程

链接:https://www.zhihu.com/question/23003213/answer/56121859 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 #include int main(int argc, char *...

sirius_0
2018/04/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

六、Spring Cloud之配置中心config

前言 前面我们讲了微服务的注册中心、负载均衡、熔断处理、网管服务。接下来我们讲配置中心,为什么要用配置中心呢? 其实我们接触一段时间就可以发现,我们的项目还是非常多的,每个项目都有...

quellanan2
9分钟前
19
0
在Android的EditText视图中允许多行?

如何在Android的EditText视图中允许多行? #1楼 这对我有用 ,实际上这两个属性很重要: inputType和lines 。 此外,您可能需要一个滚动条,下面的代码显示了如何制作一个: <EditText ...

技术盛宴
12分钟前
13
0
分享自己写的JS版日期格式化和解析工具类,绝对好用!

前言 本来想模仿Java里面的SimpleDateFormat()对象的,但是感觉这样用起来不方便,所以还是直接写成单独的方法算了。 原文链接 日期格式化 2.1. 使用说明 formatDate(date, fmt),其中fmt支持...

SuShine
22分钟前
27
0
快递鸟api物流查询接口实现订阅物流轨迹单号查询功能对接调用

背景: 分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递鸟集成api做为数据来源接口,这个接口是免费使用的,不过提供的功能还是非常强大的,有专门的售后维护团...

程序的小猿
27分钟前
24
0
Day08多态,abstract,接口

1.A:多态的概述:事物存在的多种形态。 B:多态前提:要有继承关系,方法重写和父类引用子类对象。 父类引用子类对象:Animal a = new Cat(); a.eat(); //效果等同于c.eat(); 2.多态中的...

Lao鹰
32分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部