如何使用 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++ 对象数组从 C# 传递到 C++?
在 Windows 中使用 swig 从 Java 调用 c++ 函数,得到 java.lang.UnsatisfiedLinkError