簡體   English   中英

使用SWIG導向器將python中的numpy函數傳遞給C ++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM