如何使用 SWIG 在 C++ 中调用 python 函数?

Posted

技术标签:

【中文标题】如何使用 SWIG 在 C++ 中调用 python 函数?【英文标题】:How do I call a python function in C++ using SWIG? 【发布时间】:2015-03-28 05:44:49 【问题描述】:

我有一个如下C++

class myfun
public:
    virtual double eval(arma::vec& x);
;

double op(myfun* f, arma::vec& x)
    return f->eval(x);

arma::vec 是一个犰狳 c++ 向量,我使用 armanpy.i 将 numpy 数组转换为 arma::vec 对象,反之亦然。

在启用 swig 导向器并为上述 C++ 代码创建 SWIG 接口后,我创建了一个 python 类,它重新定义了 eval 虚拟方法:

class f(mymodule.myfun):
    def __init__(self):
        super(f,self).__init__()
    def eval(self,x):
        print x
        return 3.14

在python中,我先创建了一个f的实例,它继承了myfun:

b = f()

然后,我将其传递给op

mymodule.op(b,array([3.,4.]))

哪个输出

<Swig Object of type 'arma::vec *' at 0x10e6dcc30>
3.14

Python 没有将 arma::vec * 解释为一个 numpy 数组,我认为它是在 armanpy.i 文件中执行的。有任何想法吗?我没有与 arma::vec 结婚,我可以用一个 numpy 向量替换 arma::vec。

谢谢!

【问题讨论】:

【参考方案1】:

在您的情况下,请查看提供犰狳 SWIG 文件的 armanpy。

【讨论】:

【参考方案2】:

您可以使用 Github 上的这个存储库来完成此操作,该存储库使用了 armanpy 和 armadillo 8.500.1

https://github.com/Wolframm74/armadillo_armanpy/blob/master/README.md

首先按照步骤编译代码,然后在示例的基础上进行构建。它提供了如何通过 SWIG 将 python 的 numpy 数组转换为犰狳数组的示例。

【讨论】:

以上是关于如何使用 SWIG 在 C++ 中调用 python 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 列表在 C++ 中使用 SWIG 分配 std::vector?

Swig - 结构的 C++ 向量以及如何连接它们

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

在 python swig 中读取 c++ 2d 数组

在 Windows 中使用 swig 从 Java 调用 c++ 函数,得到 java.lang.UnsatisfiedLinkError

如何使用 SWIG 从 C 调用 C# 方法?