在C++程序中调用Cython(Python3.6)
Call Cython (Python3.6) in C++ Program
我正在做一个项目,需要在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++程序中调用这些函数呢?提前谢谢。
我不知道为什么它会为公共函数生成损坏的名称——它的运行与文档相反。然而,它也在为我做这件事。我怀疑这是一个错误,但建议你暂时只使用拼写错误的名称。
您可能希望将返回类型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
文件名(
正常的cython开发模式完全相反——您可以使用它从python中调用C++代码。
cython常见用法的简单描述是"用类似python的高级语言编写代码,然后将其转换为python扩展的C源代码">
生成的C代码是不可读的,也不意味着要从C.中使用
tl;dr使用cython使您的C/C++程序可以从python调用,并编写python代码来调用它。
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 查找带有 Anaconda cmake 前缀的 boost-python3
- 将 PCL 链接到 Cython C++ 模块
- 将数组/向量发送到 c++ 脚本的 cython 示例
- Cython:无法分配给 2D 矢量
- Cython通过浮点数的最快方式,用于高频控制回路
- Cython 包含catkin_pkg设置的错误
- Python3.6 模板中的 CGAL C++ 集成错误
- 在 Cython 中传递浮点数组的最佳选择
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 通过Cython对Python的基本C++函数
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 从python调用C++函数,使用cython,使用cythonize
- 如何强制库(pybind11)包含来自Python3的<Python.h>?
- 如何通过 cython 将 numpy 数组列表传递给 C++
- 可以使用while(文件>>...C++成语在 Cython 中读取文件?
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- Cython中带有自定义比较器的优先级队列
- 重载的 operator() 在 Cython 中失败
- 在C++程序中调用Cython(Python3.6)