[英]Passing a numpy function in python to C++ using SWIG directors
我的代碼主要是在C ++中,但我想使用SWIG director選項在python中重新定義C ++虛函數,然后將該函數傳遞回C ++。 以下是一個簡化示例。
這是我在C ++中的基類,具有虛擬功能的fun
。 fun
接受(double* x, int n)
,它允許我將numpy數組傳遞給它。
class base{
public:
virtual double fun(double* x, int n){return 0.0;}
};
我有另一個接受這個基類的類:
class main{
public:
base* b_;
main(base& b){
b_ = &b;
}
};
這個類有一個構造函數,它接受一個基類並存儲一個指向它的指針( b_
)。
我可以成功地將swig接口編譯成一個名為mymodule
的模塊,確保啟用mymodule
(參見下面的SWIG接口文件),並且根據SWIG導向器文檔,我繼承了基類並重新定義了虛函數的fun
,如下所示:
import mymodule
class base(mymodule.base):
def __init__(self):
super(base,self).__init__()
def fun(self,x):
return x[0]
然后我把它傳遞到main
類:
b = base()
m = mymodule.main(b)
但是,當我嘗試m.b_.fun(array([1.,2.]))
我得到一個TypeError
:
TypeError: 'SwigPyObject' object has no attribute '__getitem__'
有關如何使其工作的任何想法? 我認為當我將b
傳遞給mymodule.main時,C ++會將x
視為double *指針,並且不知道如何處理它。
順便說一下,這是我的swig界面文件:
%module(directors="1") mymodule
%{
#define SWIG_FILE_WITH_INIT
/* Includes the header in the wrapper code */
#include "myclasses.h"
%}
%feature("director") base;
%init %{
import_array();
%}
%apply (double* IN_ARRAY1, int DIM1) {(double* x, int n)};
/* Parse the header file to generate wrappers */
%include "myclasses.h"
它看起來像Python的所有權問題。
提供給SWIG的提示:
%new double *fun(double* IN_ARRAY1, int DIM1) {(double* x, int n)};
注意指向函數本身的指針。 當使用%new時,Python模塊將為對象分配適當的所有權。 這就是為什么你可以在調用中使用值而不是變量。
導演似乎沒有認識到你的Python實現的fun(double* x, int n)
; 它沒有進行該功能的重載。
我懷疑原因是因為你的Python實現使用numpy作為參數。 請注意,導演將調用抽象函數或實現函數。
另一方面, %apply (double* IN_ARRAY1, int DIM1) {(double* x, int n)}
僅聲明用於在Python中包裝函數的typemap邏輯,而不是Director。 請注意,這就是為什么b.fun(array([1.,2.])
有效的原因!說,你應該向director聲明typemap邏輯。
在這里你可以找到如何做到這一點:
%typemap(directorin,numinputs=1) (double *x, int n)
{
npy_intp dim = $2;
$input = PyArray_SimpleNewFromData(1, &dim, NPY_DOUBLE, (void *)$1);
}
希望這能解決你的問題和其他未來問題:)。 我遇到了類似的問題,並花了幾天時間試圖找出答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.