我是否需要在使用Cython封装C++时递归包含所有头文件?

4

我正在尝试使用Cython包装一个C++库。

这些头文件本身包括其他库来定义类型(实际上,相当多),有些像这样:

#include <Eigen/Dense>

namespace abc {
namespace xyz {
typedef Eigen::Matrix<double, 5, 1> Column5;
typedef Column5 States;
}}

有很多“外部”类型定义。是否有一种方法为Eigen库编写.pxd文件?我只需要在我的.pxd文件中提供类型“States”以供导入(封装)类定义使用...


你有库源码吗? - The Floating Brain
是的,它们(原则上)可用。标题是否足够? - Moritz
是的,抱歉我有一个疯狂的想法,但我在我的机器上尝试了一下,结果没有成功 :-( - The Floating Brain
@user2055010 不会的。你还需要以某种方式链接Eigen库。请查看我回答下面的评论中的链接。 - Gauthier Boaglio
1个回答

3
我不确定你的问题是什么,但据我所理解的是:只需暴露你需要的东西(这里是State类型)。
在你的.pyx.pxd文件中:
(假设你问题中的代码是一个名为my_eigen.h的文件的一部分)
# Expose State 
cdef extern from "some_path/my_eigen.h" namespace "xyz" :
    cdef cppclass States:
        # Expose only what you need here
        pass

完成上述包装后,您可以在Cython代码中随时使用State

# Use State as is in your custom wrapped class
cdef extern from "my_class_header.h" namespace "my_ns" :
    cdef cppclass MyClassUsingStates:
        double getElement(States s, int row, int col)
        ...

示例:

我的需求是:有一个用于 std::ofstream 的Python处理程序,并且不需要公开其任何方法(因此我未公开任何方法,但这是可能的...)

cdef extern from "<fstream>" namespace "std" :
    cdef cppclass ofstream:
        pass

cdef class Py_ofstream:
    cdef ofstream *thisptr

    def __cinit__(self):
       self.thisptr = new ofstream()

    def __dealloc__(self):
       if self.thisptr:
           del self.thisptr

注意:这里我直接将它作为单个块使用在我的 .pyx 中(没有额外的 .pyd)。
如果我误解了问题,请告诉我...

谢谢!我会尝试一下。目前我正在努力解决Cython编译(我的setup.py)的问题,可能需要一些时间。 - Moritz
@user2055010 我已经写了一些可能对你有用的东西这里这里。希望能有所帮助。 - Gauthier Boaglio
1
谢谢您提供这些 setup.py 文件!它们现在被存储为参考资料;因为在大多数在线“教程”中,它们省略了重要的“include_dirs”等部分。同时,我成功地使用 Cython.Build 中的“cythonize”编译了一些东西。 - Moritz
1
基本上,你的回答是正确的。我感到困惑是因为从教程中我被说服了你的 cdef 必须公开 C++ 模块的 所有 部分。 - Moritz
很高兴能帮忙。;) 如果我还能做更多,请随时提出! - Gauthier Boaglio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接