如何暴露一个不能直接暴露的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++函数,同名的主要内容,如果未能解决你的问题,请参考以下文章

在 Mono 中将 C++ 暴露给 C#:函数的无效转换?

Cython - 将 C++ 函数返回的 C++(向量和非向量)对象暴露给 Python

如何将 C# 元组暴露给 C++

C++ 类以时尚 TypeError 暴露于 QML 错误:对象的属性“...”不是函数

Boost Python 暴露 C++ 类,构造函数采用 std::list

将非托管 c++ 类库暴露给 c#