python - C++程序中调用Cython(Python3.6)

标签 python c++ c python-3.x cython

我正在做一个项目,我需要在 C++ 中嵌入一些 Python 代码。我已经尝试 Cython 一段时间了,但我仍然有很多问题。这是我试过的演示。

这里我有几个包含结构和函数的文件:

首先,这是文件 cat.pyx

cdef public struct Cat:
    int num

cdef public setCatNum(Cat* cat):
    cat.num = 100

cdef public int getCatNum(Cat* cat):
    return cat.num

及其.pxd文件cat.pxd:

cdef public struct Cat:
    int num

cdef public setCatNum(Cat* )
cdef public int getCatNum(Cat* )

这是我的setup.py:

from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("cat", ["cat.pyx"], include_dirs=['.']),
    ]

setup(
  name='dotest',
  cmdclass={'build_ext': build_ext},
  ext_modules=ext_modules,
  script_args=['build_ext'],
  options={'build_ext':{'inplace':True, 'force':True}}
)

它可以正确编译,但在生成的 cat.h 文件中,函数声明是另外一回事:

__PYX_EXTERN_C PyObject *__pyx_f_3cat_setCatNum(struct Cat *); __PYX_EXTERN_C int __pyx_f_3cat_getCatNum(struct Cat *);

那么我如何在我的 C/C++ 程序中调用这些函数呢?提前谢谢你。

最佳答案

我不确定为什么它会为公共(public)函数生成错乱的名称 - 它与 the documentation 背道而驰.但是它也在为我做这件事。我怀疑这是一个错误,但目前建议您只使用损坏的名称。

您可能想要设置 setCatNum 的返回类型至 void .目前它返回 PyObject* (总是 None )这没有用,意味着你必须处理它的引用计数。

cdef public void setCatNum(Cat* )

我认为您感到困惑的是 Python 2 和 3 之间的区别。文档建议替换 init<modulename>

err = PyImport_AppendInittab("modulename", PyInit_modulename);
Py_Initialize();
modulename_module = PyImport_ImportModule("modulename");

这是您需要进行的唯一更改 - 您实际上不需要使用模块对象。

一个工作示例:

#include <Python.h>
#include "cat.h"
#include <iostream>

int main() {

    auto err = PyImport_AppendInittab("cat", PyInit_cat);
    if (err) {
        std::cout << "ERROR!\n";
        return 1;

    }
    Py_Initialize();
    auto cat_module = PyImport_ImportModule("cat"); // you don't actually have to do anything with this module object
    Cat c;
    __pyx_f_3cat_setCatNum(&c);
    std::cout << __pyx_f_3cat_getCatNum(&c) << "\n";
    Py_Finalize();
}

在 Linux 上编译成功

g++ example_cpp.cpp -o example `python3-config --includes --libs` ./cat.cpython-36m-x86_64-linux-gnu.so

(您可能需要更改确切的 cat 文件名)

关于python - C++程序中调用Cython(Python3.6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51311521/

相关文章:

python - 断言错误: Cannot apply DjangoModelPermissionsOrAnonReadOnly on a view that does not set `.queryset` or have a `.get_queryset()` method

c++ - bool 运算符可以与预处理器一起使用吗?

python - 如何使用 Pandas 的时间戳按小时对数据帧进行分组

python - 获取错误 - 'could not find a writer' 同时提供 imshow,imwrite 命令 opencv

c++ - 写入 I/O 端口 Controller 驱动程序(输入)(PS/2 键盘端口)左右键盘按键?

c - 为什么C中void main函数内的参数值初始化为1?

c - 理解指针操作

c - C 编译器优化局部静态变量是否合法?

python - 尝试从成绩数据字典中获取加权平均值

c++ - 表示日期的字符串并对其进行转换