【发布时间】:2021-02-28 03:09:33
【问题描述】:
当我想使用 .pxd 和 .pyx 文件在 Python 中使用我的 C++ 代码时,我可以在 pxd 文件中导入 libcpp.vector 后使用 vector。是否可以编写自己的 C++ 类并在使用矢量的 pxd 文件中使用它们(例如使用 std::array)?
一方面,libcpp 似乎只包含矢量的 pxd 文件,而另一方面,cython 编译器在处理矢量时似乎做了一些额外的技巧。
【问题讨论】:
当我想使用 .pxd 和 .pyx 文件在 Python 中使用我的 C++ 代码时,我可以在 pxd 文件中导入 libcpp.vector 后使用 vector。是否可以编写自己的 C++ 类并在使用矢量的 pxd 文件中使用它们(例如使用 std::array)?
一方面,libcpp 似乎只包含矢量的 pxd 文件,而另一方面,cython 编译器在处理矢量时似乎做了一些额外的技巧。
【问题讨论】:
Cython 对 std:: vector 等类型的包装分为两部分:
它为您定义的 .pxd 文件到 cimport(例如 https://github.com/cython/cython/blob/master/Cython/Includes/libcpp/vector.pxd)。这些是为了您的方便而提供的(以节省每个人重写相同文件的工作量)。它们使用标准 Cython 语法,您可以创建类似的文件来包装其他类。
与 Python 类型 documented here 的自动转换。这是 Cython 内置的,您不能将其应用于您包装的其他类型。不过,这不应阻止您创建可用的包装 - 您可能只需要在 Python/C++ 接口处手动复制更多数据。
在 Cython 中包装 std::array 有点挑战性,因为 Cython 无法轻松处理数字模板参数。您可以在 Stack Overflow 和其他地方(Interfacing C++11 array with Cython、Wrapping std::array in Cython and Exposing it to memory views)上找到各种技巧来说服它工作,但都不是很好。
【讨论】: