第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 ctypes 將數(shù)組從 Go [lang] 返回到 Python?

如何使用 ctypes 將數(shù)組從 Go [lang] 返回到 Python?

Go
鴻蒙傳說 2023-03-21 14:44:51
我正在嘗試編寫一些在 GoLang 中創(chuàng)建數(shù)組的代碼,并將其返回給 python 腳本 ctypes(和一些 numpy)。到目前為止我所得到的不起作用,我不明白為什么......我將不勝感激任何幫助!我的 Go 代碼是這樣的:func Function(physics_stuff... float64,  N int ) []float64{    result := make([]float64, N)    for i:= 0; i< N; i++{        result[i] =  blah....    }    return result;}我目前正在嘗試使用以下方法將此功能導(dǎo)入 python:from ctypes import c_double, cdll, c_intfrom numpy.ctypeslib import ndpointerlib = cdll.LoadLibrary("./go/library.so")lib.Function.argtypes = [c_double]*6 + [c_int]def lovely_python_function(stuff..., N):    lib.Function.restype = ndpointer(dtype = c_double, shape = (N,))    return lib.Function(stuff..., N)這個 python 函數(shù)永遠不會返回。來自同一個庫的其他函數(shù)工作得很好,但它們都返回一個 float64(python 中的 c_double)。
查看完整描述

1 回答

?
有只小跳蛙

TA貢獻1824條經(jīng)驗 獲得超8個贊

在您的代碼中restype期待_ndtpr類型,請參閱:

lib.Function.restype?=?ndpointer(dtype?=?c_double,?shape?=?(N,))

在 numpy 文檔中也可以看到:

def ndpointer(dtype=無,ndim=無,形狀=無,標志=無)

[其他文本]

退貨

klass : ndpointer 類型對象

一個類型對象,它是一個_ndtpr包含 dtype、ndim、shape 和 flags 信息的實例
。

[其他文本]

這種方式lib.Function.restype就是指針類型,在Golang中挪用的類型一定是unsafe.Pointer。

但是你想要一個需要作為指針傳遞的切片:

func Function(s0, s1, s2 float64, N int) unsafe.Pointer {

? ? result := make([]float64, N)

? ? for i := 0; i < N; i++ {

? ? ? ? result[i] = (s0 + s1 + s2)

? ? }

? ? return unsafe.Pointer(&result)//<-- pointer of result

}

這會導(dǎo)致在Go 和 C 之間傳遞指針的規(guī)則中出現(xiàn)問題。

  1. 調(diào)用返回后,C 代碼可能不會保留 Go 指針的副本。

所以必須轉(zhuǎn)unsafe.Pointeruintptrgolang類型。


func Function(s0, s1, s2 float64, N int) uintptr {

? ? result := make([]float64, N)

? ? for i := 0; i < N; i++ {

? ? ? ? result[i] = (s0 + s1 + s2)

? ? }

? ? return uintptr(unsafe.Pointer(&result[0]))//<-- note: result[0]

}

這樣你就可以正常工作了!

注意:?C 中 slice 的結(jié)構(gòu)由 表示typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;,但 C 只需要數(shù)據(jù),因為這只是需要結(jié)果void *data(第一個字段,或字段[0])。


查看完整回答
反對 回復(fù) 2023-03-21
  • 1 回答
  • 0 關(guān)注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號