如何暴露一个不能直接暴露的c++函数,同名
Posted
技术标签:
【中文标题】如何暴露一个不能直接暴露的c++函数,同名【英文标题】:How to expose a c++ function that cannot be exposed directly, with the same name 【发布时间】:2017-08-30 07:41:56 【问题描述】:据我了解,由于内存共享限制,不可能在 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 是进行这种包装的简单方法。 【参考方案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
【讨论】:
以上是关于如何暴露一个不能直接暴露的c++函数,同名的主要内容,如果未能解决你的问题,请参考以下文章
Cython - 将 C++ 函数返回的 C++(向量和非向量)对象暴露给 Python
C++ 类以时尚 TypeError 暴露于 QML 错误:对象的属性“...”不是函数