Cython 将类似 python 的代码编译为 C++ 代码,然后使用 gcc/g++ 将其编译为像 pyd 这样的库。
假设我会用纯 C++ 编写代码,然后将其编译为 pyd 以在 Python 中使用它,例如假设我有以下 C++ 模块
int sum(int a, int b){
return a + b
}
是否可以在不使用 PyObject、Ctype ...等的情况下将该代码编译到 pyd 中?或者代码是否必须首先使用 Cython 语法编写才能与 Python 兼容?
我不是这方面的专家,但由于还没有人回答,这是我的意见:
如果您想避免在 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 函数即可从动态库中使用并编译您的代码。
这是将 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!