专栏首页若是烟花使用C语言编写Python扩展包

使用C语言编写Python扩展包

使用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'
>>>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HTML 学习

    参考: http://www.w3cschool.cc/html/html-tutorial.html

    lpe234
  • gRPC基本使用(一)--java与go之间的相互调用

    gRPC是一个高性能、开源、通用的RPC框架,面向移动和HTTP/2设计。gRPC 默认使用 protocol buffers,这是 Google 开源的一套成...

    lpe234
  • PlantUML基本使用(一)--时序图

    安装好插件后可在新建菜单中,看到许多UML相关的模板。选择UML sequence即可。

    lpe234
  • Golang之strings包

    比较全的是golang中文网的:https://studygolang.com/articles/5769

    超蛋lhy
  • GO-字符串常用操作

    package main import ( "fmt" "strconv" "strings" ) func ma...

    李海彬
  • GO-字符串常用操作

    package main import ( "fmt" "strconv" "strings" ) func ma...

    李海彬
  • 2018上半年勒索病毒情况分析

    通过对勒索病毒的长期监测与跟踪分析,发现2018年上半年勒索病毒的攻击目标、传播方式、技术门槛、新家族/变种、赎金支付方式等方面均呈现出新的特点:

    C4rpeDime
  • 一个可以走业务流程的类似网盘的资料管理系统

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    hotqin888
  • 『互联网架构』软件架构-API接口安全网关《service变controller》(15)

    PS:代码直接看源码,主要是了解思路,对于性能我建议先别考虑,先实现之后才能谈性能问题,性能问题没有绝对的只有相对的。最主要是签名的获取生成的思路。

    IT故事会
  • 列表的常用操作,这十张图把它说的明明白白!

    列表( list)作为Python中最常用的数据类型之一,是一个可增加、删除元素的可变(mutable)容器。

    石晓文

扫码关注云+社区

领取腾讯云代金券