Я пытаюсь обернуть библиотеку C ++, используя Cython.
Сами заголовки включают в себя другие библиотеки для определения типов (на самом деле, довольно много), что-то вроде этого:
#include <Eigen/Dense>
namespace abc {
namespace xyz {
typedef Eigen::Matrix<double, 5, 1> Column5;
typedef Column5 States;
}}
Есть много «внешних» определений типов. Есть ли способ не написать также файл .pxd для библиотеки Eigen? Мне просто нужен тип «Состояния», доступный в моем .pxd-файле для импортированных (упакованных) определений классов …
Я не уверен в том, что вы просите, но, насколько я понял, я бы сказал: просто представьте, что вам нужно (здесь 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
После того, как вы сделали завершение выше, вы можете использовать State
где когда-либо вам это нужно в коде Cython.
# 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)
...
Пример:
Здесь мне нужно было: иметь обработчик Python для std::ofstream
и нет необходимости выставлять какие-либо из его методов (так что я не выставлял ни один, но это было бы возможно …)
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
).
Подскажите, если неправильно понял вопрос …
Других решений пока нет …