在Cython中包装C ++时,是否必须递归包含所有标题

时间:2013-06-25 18:32:23

标签: c++ cython wrapping

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

标题本身包含其他库来定义类型(实际上,非常多),像这样的事情:

#include <Eigen/Dense>

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

有很多“外部”类型定义。有没有办法为Eigen库写一个.pxd文件?我只需要在我的.pxd文件中提供“States”类型的导入(包装)类定义...

1 个答案:

答案 0 :(得分:1)

我不确定你要求的是什么,但据我所知,我会说:只是暴露你需要的东西(这里是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处理程序,不需要公开它的任何方法(所以我没有暴露,但它本来可能......) < / p>

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)。

告诉我是否误解了这个问题......