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

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

python 調用 cgo 庫 -- 32 位和 64 位問題

python 調用 cgo 庫 -- 32 位和 64 位問題

Go
鴻蒙傳說 2022-08-09 20:31:19
我構建了一個cgo庫,并使用python(帶有ctypes包)來調用它。代碼被編譯成32位和64位版本,這些庫分別由32位和64位python程序調用。我發(fā)現顯然參數沒有正確傳遞。我認為這可能與數組在python程序和庫之間的定義和傳遞方式有關。例如,go 庫“callnames.so”中的函數定義為func Initialize(namelist []*C.char, grp *C.char)調用此函數的python代碼部分是類GoSliceChar(Structure):字段= [(“data”, POINTER(c_char_p)), (“l(fā)en”, c_longlong), (“cap”, c_longlong)]numNames = 3n1 = c_char_p(b"peter")n2 = c_char_p(b"tom")n3 = c_char_p(b"nancy")group = c_char_p(b"group1")names = GoSliceChar((c_char_p * numComponents)(n1, n2, n3), numNames, numNames ) lib = cdll.LoadLibrary("./callnames.so")lib.Initialize(names,  group)這些代碼在64位環(huán)境下工作正常,即python-64 + 64位cgo庫。但是,當我切換到32位時出現問題。我有一個快速而骯臟的修復,通過將Python中的GoSliceChar的定義更改為    class GoSliceChar(Structure):       _fields_ = [("data", POINTER(c_char_p)), ("len", c_long), ("cap", c_long)] 但我真的不明白為什么這個問題得到了解決,以及它是否是一個可靠的解決方案。請幫忙。謝謝。
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

我對我的問題有一些新的發(fā)現。看起來就像編譯 cgo 庫后,會自動生成一個 .h 文件。在此文件中,所有數組都定義為 GoSlice


typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

對于 32 位庫,GoInt 由下式定義


typedef GoInt32 GoInt;

而對于 64 位庫,GoInt 由下式定義


 typedef GoInt32 GoInt; 

在我看來,在調用這些庫時,必須確保python代碼能夠適應這一點。


class GoSliceChar(Structure):

    if is_64bit():

        _fields_ = [("data", POINTER(c_char_p)), ("len", c_longlong), ("cap", c_longlong)]  

    else:

        _fields_ = [("data", POINTER(c_char_p)), ("len", c_long), ("cap", c_long)]


查看完整回答
反對 回復 2022-08-09
  • 1 回答
  • 0 關注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號