• 使用C/C++代码编写Python模块


    假如我们要用C语言实现下面的python脚本bird.py

    import os
    
    def fly(name):
        print(name + " is flying.
    ")
    

    调用脚本main.py

    import bird
    
    bird.fly("fwd")
    

    执行效果如下

    > python main.py
    fwd is flying.
    

    实现相同逻辑的原始C代码bird.c

    #include <stdio.h>
    
    void fly(const char *name)
    {
        printf("%s is flying.
    ", name);
    }
    

    下面我们要将原始C代码改造成可以被main.py的python模块:

    • 包含头文件Python.h
    • 添加C函数fly的Python调用版本bird_fly
    • 添加向Python呈现C函数的方法表bird_methods
    • 添加模块初始化函数initbird(当动态库被python解释器搜索到时调用的函数)
    #include <Python.h>
    #include <stdio.h>
    
    void fly(const char *name)
    {
        printf("%s is flying.
    ", name);
    }
    
    static PyObject *bird_fly(PyObject *self, PyObject *args)
    {
        const char *name;
        if (!PyArg_ParseTuple(args, "s", &name))
            return NULL;
        fly(name);
    
        Py_INCREF(Py_None);
        return Py_None;
    }
    
    static PyMethodDef bird_methods[] = {
        { "fly", bird_fly, METH_VARARGS, "Bird fly" },
    { NULL, NULL, 0, NULL }
    };
    
    PyMODINIT_FUNC initbird(void)
    {
        PyImport_AddModule("bird");
        Py_InitModule("bird", bird_methods);
    }
    

    Linux下编译

    # yum install -y python-devel
    # gcc -o bird.so `python-config --cflags` `python-config --libs` -shared bird.c
    ### 将main.py和bird.so放置在同一目录下
    # python main.py
    fwd is flying.
    

    Windows下编译

    VS2017(只需安装python2.7的64位版本即可,本地开发工具可不装)下创建空项目bird,然后添加源文件bird.cpp(内容同bird.c),项目配置如下:

    Tab 属性
    常规 常规 > 目标名称 将此字段设置为与 Python 看到的模块名称完全匹配。
    常规 常规 > 目标扩展名 .pyd
    常规 项目默认值 > 配置类型 动态库(.dll)
    C/C++ > 常规 附加包含目录 根据相应的安装添加 Python include 文件夹,例如 C:Python27amd64include
    C/C++ > 预处理器 预处理器定义 在字符串的开头添加 Py_LIMITED_API;,可限制可从 Python 调用的某些函数,并使代码在 Python 不同版本之间更易于移植。
    C/C++ > 代码生成 运行库 多线程 DLL (/MD)(请参阅下面的“警告”)
    链接器 > 常规 附加库目录 根据相应的安装添加包含 .lib 文件的 Python libs 文件夹,例如 C:Python27amd64libs。 (务必指向包含 .lib文件的 libs 文件夹,而非包含 .py 文件的 Lib 文件夹。)
    ### 记住选择release + x64编译模式,否则编译dll会报错,然后将main.py和bird.pyd放置在同一目录下
    birdx64Release> python main.py
    fwd is flying.
    

    参考文档

    创建适用于 Python 的 C++ 扩展

  • 相关阅读:
    Day1-CSS-下拉菜单
    scau 1138 代码等式
    SCAU-1076 K尾相等数
    勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创)
    SCAU-1144 数星星-HDU-1166-树状数组的应用
    NodeJs Fs模块
    Node核心模块
    flutter环境配置
    纯CSS制作图形效果
    CSS3选择器
  • 原文地址:https://www.cnblogs.com/silvermagic/p/9087896.html
Copyright © 2020-2023  润新知