簡體   English   中英

SWIG返回PyObject作為python對象嗎?

[英]SWIG return PyObject as python object?

假設我有一個SWIG封裝的類,負責處理一些數據的指針,如以下代碼所示。 我想從數據構造一個numpy ndarray對象,並將其返回給用戶。 我希望它使用數據作為緩沖區,但不占用所有權。 如果我是對的,我將使用numpy C ++ API PyArray_SimpleNewFromData 但是,我的問題是如何將其返回給python? 如果我編寫以下get函數,SWIG會自動將其作為python對象返回嗎? 如果沒有,我該怎么辦?

class Test {
 public:
  Test () { ptr_ = new uint8_t[200]; }
  ~Test() { delete [] ptr_; }

  PyObject* get() {
    npy_intp dims[1] = {25};
    return PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, ptr_);
  }

 private:
  uint8_t* ptr_;
};

順便說一下,我也在努力尋找上述api的頭文件和庫文件。 如果您知道,也請告訴我。 謝謝。

更新:

我試過SWIG包裝此類。 其他一切都很好,除了當我在python中調用get函數(如下所示)時,我遇到了段錯誤。 任何幫助表示贊賞。

x = Test()
y = x.get()

更新2:

似乎PyArray_SimpleNewFromData是已棄用的函數。 那么這是否仍然受支持,或者還有其他推薦的方法嗎?

我在swig中使用typemap找出了解決方案:

%typemap(out) double* {
  npy_intp dims[1] = {25};
  $result = PyArray_SimpleNewFromData(1, dims, PyArray_DOUBLE, $1);
}

class Test {
 public:
  Test () { ptr_ = new uint8_t[200]; }
  ~Test() { delete [] ptr_; }

  double* get() {
    return (double*) ptr_;
  }

 private:
  uint8_t* ptr_;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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