我正在尝试使用Cython包装C ++库。
标题本身包含其他库来定义类型(实际上,非常多),像这样的事情:
#include <Eigen/Dense>
namespace abc {
namespace xyz {
typedef Eigen::Matrix<double, 5, 1> Column5;
typedef Column5 States;
}}
有很多“外部”类型定义。有没有办法不为Eigen库写一个.pxd文件?我只需要在我的.pxd文件中提供“States”类型的导入(包装)类定义...
答案 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
)。
告诉我是否误解了这个问题......