Нужно ли рекурсивно включать все заголовки при переносе C ++ в Cython

Я пытаюсь обернуть библиотеку C ++, используя Cython.

Сами заголовки включают в себя другие библиотеки для определения типов (на самом деле, довольно много), что-то вроде этого:

#include <Eigen/Dense>

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

Есть много «внешних» определений типов. Есть ли способ не написать также файл .pxd для библиотеки Eigen? Мне просто нужен тип «Состояния», доступный в моем .pxd-файле для импортированных (упакованных) определений классов …

2

Решение

Я не уверен в том, что вы просите, но, насколько я понял, я бы сказал: просто представьте, что вам нужно (здесь 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).

Подскажите, если неправильно понял вопрос …

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]