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

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

import os

def fly(name):
    print(name + " is flying.\n")

调用脚本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.\n", 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.\n", 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:\Python27amd64\include
C/C++ > 预处理器预处理器定义在字符串的开头添加 Py_LIMITED_API;,可限制可从 Python 调用的某些函数,并使代码在 Python 不同版本之间更易于移植。
C/C++ > 代码生成运行库多线程 DLL (/MD)(请参阅下面的“警告”)
链接器 > 常规附加库目录根据相应的安装添加包含 .lib 文件的 Python libs 文件夹,例如 C:\Python27amd64\libs。 (务必指向包含 .lib文件的 libs 文件夹,而非包含 .py 文件的 Lib 文件夹。)
### 记住选择release + x64编译模式,否则编译dll会报错,然后将main.py和bird.pyd放置在同一目录下
bird\x64\Release> python main.py
fwd is flying.

参考文档

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

转载于:https://www.cnblogs.com/silvermagic/p/9087896.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值