【问题标题】:Do I have to recursively include all headers when wrapping C++ in Cython在 Cython 中包装 C++ 时是否必须递归包含所有标头
【发布时间】:2013-06-22 16:46:21
【问题描述】:

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

标头本身包含其他库来定义类型(实际上,很多),如下所示:

#include <Eigen/Dense>

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

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

【问题讨论】:

  • 你有库资源吗?
  • 是的,它们是可用的(原则上)。标题是否足够?
  • 是的,对不起,我有一个疯狂的想法,但我在我的机器上尝试过,但没有成功:-(
  • @user2055010 不,不会。您还需要以某种方式与 Eigen 库链接。请参阅我的答案下方评论中的链接。

标签: c++ cython word-wrap


【解决方案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 处理程序,并且不需要公开它的任何方法(所以我没有公开任何方法,但这是可能的......)

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),所以可能需要一段时间。
  • @user2055010 我已经写了一些可能对你有用的东西herehere。它可能会有所帮助。
  • 感谢您提供这些 setup.py!它们现在存储为参考;)因为在您在网上找到的大多数“教程”中,它们都省略了 import 和“include_dirs”等部分。同时,我设法使用 Cython.Build 中的“cythonize”编译了一些东西。
  • 基本上,你的回答是对的。我很困惑,因为从教程中我确信您的 cdefs 必须公开 C++ 模块的所有
  • 很高兴为您提供帮助。 ;) 如果我能做更多,请问!
猜你喜欢
  • 2013-08-21
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多