【问题标题】:How to expose a c++ function that cannot be exposed directly, with the same name如何暴露一个不能直接暴露的c++函数,同名
【发布时间】:2023-03-12 09:24:01
【问题描述】:

据我了解,由于内存共享限制,不可能在 python 中公开返回向量 [T] 的 C++ 函数。 因此,有必要创建一个使用导入函数的第二个函数,并将其正确地暴露给 python 扩展模块。

问题是:我不能使用相同的函数名,并且我的扩展模块最终得到了许多奇怪的函数名。例如。看下面,C++函数的导入,然后是expose:

cdef extern from "somestuffs.h" namespace "stf":
    cdef vector[float] stufffn(int n)

cpdef np.ndarray[np.float64_t, ndim=1] pystufffn(int n):
    return np.asarray(stufffn(n))

有没有办法直接公开函数 stufffn 而不使用附加函数? 有没有办法在扩展中保留名称“stufffn”并避免使用“pystufffn”?

请注意,由于我正在为现有库构建包装器,因此无法重命名某些代码。

提前感谢您的任何回答。

【问题讨论】:

  • 您可以使用 boost python 将 c++ 类和函数公开给 python。是的,您可以将向量从 c++ 函数返回给 python。只有你必须将向量类型也暴露给 python 模块。
  • 我现在正在发现 boost python,看起来很棒。你的最后两句话有什么指针/参考/例子吗?
  • 另见 pybind11,本质上是一个“现代”(利用 c++11)版本的 Boost.Python pybind11.readthedocs.io/en/stable/intro.html
  • pybind11 是进行这种包装的简单方法。

标签: python c++ cython


【解决方案1】:

下面的文档链接中的一种方法是在 pxd 文件中声明您的外部函数,并将其与命名空间一起使用,以便您可以在实现中重复使用该名称。

# wrappers.pxd
cdef extern from "somestuffs.h" namespace "stf":
    cdef vector[float] stufffn(int n)

# mymodule.pyx
cimport wrappers
cpdef np.ndarray[np.float64_t, ndim=1] stufffn(int n):
    return np.asarray(wrappers.stufffn(n))

http://cython.readthedocs.io/en/latest/src/userguide/sharing_declarations.html#using-cimport-to-resolve-naming-conflicts

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2020-06-02
    • 2019-07-13
    • 2018-08-08
    相关资源
    最近更新 更多