使用cython将c++代码编译成pyd

问题描述 投票:0回答:2

Cython 将类似 python 的代码编译为 C++ 代码,然后使用 gcc/g++ 将其编译为像 pyd 这样的库。

假设我会用纯 C++ 编写代码,然后将其编译为 pyd 以在 Python 中使用它,例如假设我有以下 C++ 模块

int sum(int a, int b){
    return a + b
}

是否可以在不使用 PyObject、Ctype ...等的情况下将该代码编译到 pyd 中?或者代码是否必须首先使用 Cython 语法编写才能与 Python 兼容?

python c++ cython
2个回答
0
投票

我不是这方面的专家,但由于还没有人回答,这是我的意见:

如果您想避免在 C 中使用 PyObject 结构和“Python.h”,则应该使用 cython。

问题在于 **.pyd 是一个专门准备的 DLL,它公开了 import() 友好的接口,我认为它包括返回 PyObjects。

但是在普通 DLL 或共享对象库上使用 ctypes 并不难:

>>> import ctypes
>>> mysum = ctypes.cdll.LoadLibrary("mysum.so") # Or DLL
>>> print mysum.sum(2, 3)
5

您只需导出 sum 函数即可从动态库中使用并编译您的代码。


0
投票

这是将 c++ 编译为 .pyd 文件的简单示例:

1。如果尚未安装 Cython,请安装:

pip install Cython

2。接下来,使用您的 C++ 代码创建主文件。 在本例中,它是 OP 发布的简单功能。 这里,内部函数被称为

w_my_sum
,因为稍后会解开它:

helper.cpp:

#include "helper.h"

int w_my_sum(int a, int b){
    return a + b;
}

3。创建头文件。 这讲述了导入的函数:

helper.h

#ifndef HELPER_H
#define HELPER_H

#include <stdint.h>

int w_my_sum(int a, int b);

#endif

4。 创建 Cython 代码以导入和包装 C++ 函数(

w_my_sum
)。 在这里,函数
my_sum
将针对 python 导入级别公开。

mylib.pyx

# cython: c_string_type=unicode, c_string_encoding=utf8

cdef extern from "helper.h":
    int w_my_sum(int a, int b)

def my_sum(int a, int b):
    return w_my_sum(a, b)

5。最后,创建

setup.py
文件来构建
.pyd
文件。

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

extensions = [
    Extension(
        "mylib",
        ["mylib.pyx", "helper.cpp"],
        language="c++",
    )
]
setup(name="mylib", ext_modules=cythonize(extensions))

6。构建扩展。 在命令行:

python setup.py build_ext --inplace

7。测试它是否有效。 在你的Python环境中(这里只是在同一目录中使用Python REPL):

>>> import mylib
>>> mylib.my_sum(1,2)
3
>>> # works!
© www.soinside.com 2019 - 2024. All rights reserved.