cython编译pyd并且c调用
cython代码
d.pyx
def func01(n):
for i in range(n):
print(f'func01({i})')
return n*2
编译代码
setup.py
from setuptools import setup
from Cython.Build import cythonize
from Cython.Distutils import Extension # 需要导入Extension类
# 创建Extension对象并指定模块名称
ext_modules = [
Extension(
name="d", #这里指定模块名称
sources=["d.pyx"], # 源文件列表
language_level="3" # 可选:Python3语法
)
]
setup(
ext_modules=cythonize(ext_modules) # 将Extension对象传入cythonize
)
cython编译命令
python setup.py build_ext --inplace
a.c
#include <Python.h>
int main() {
Py_Initialize();
// 导入模块
PyObject* pModule = PyImport_ImportModule("d");
if (!pModule) {
PyErr_Print();
return 1;
}
// 获取函数
PyObject* pFunc = PyObject_GetAttrString(pModule, "func01");
if (!pFunc || !PyCallable_Check(pFunc)) {
PyErr_Print();
Py_DECREF(pModule);
return 1;
}
// 准备参数
PyObject* pArgs = PyTuple_Pack(1, PyLong_FromLong(3));
// 调用函数
PyObject* pResult = PyObject_CallObject(pFunc, pArgs);
// 处理结果
if (pResult) {
printf("res = %ld\n", PyLong_AsLong(pResult));
Py_DECREF(pResult);
}
// 清理
Py_DECREF(pArgs);
Py_DECREF(pFunc);
Py_DECREF(pModule);
Py_Finalize();
return 0;
}
c代码编译
gcc -I 你的python.h头文件所在目录 -L 你的python3.dll所在目录 -l python3 a.c