golang和python互相呼叫

2022-03-18 14:02:58 字數 2152 閱讀 2663

python3-ctypes: 

golang-cgo: 

綜述golang和python之間,當前可以通過golang的cgo和python的ctypes,把golang物件和python物件分別轉換為c物件,從而通過編譯和呼叫c的動態連線庫,完成互動。

python呼叫golang:

go 函式實現:

package main

import "c"

//export add

func add(left, right int) int

func main()

通過c-shared模式編譯成so:

go build -buildmode=c-shared -o libadd.so libadd.go

python呼叫so:

from ctypes import cdll

lib = cdll.loadlibrary('./libadd.so')

print("loaded go generated so library")

result = lib.add(2, 3)

print(result)

注意: 只有int可以不需要轉換,直接在go和c直接互相呼叫

對於不同的型別,需要使用cgo中定義的方法轉換,具體可以參考golang-cgo文件。

比如string需要用c.char來傳遞,c.gostring(s)可以將c.char型別轉換為string,反之c.cstring可以把string型別轉為 *c.char

使用舉例:

編譯.so:

go build -buildmode=c-shared -o ~/develop/law_dev/law_service/util/parseareacode.so test_other.go

python呼叫:

用.argtype和.restype可以定義呼叫動態連線庫函式的傳入和傳出引數

# 通過golang的"github.com/ppmoon/gbt2260"包解析area code

import os

from ctypes import cdll, c_char_p

current_path = os.path.dirname(os.path.realpath(__file__))

lib = cdll.loadlibrary(current_path + '/parseareacode.so')

parsecode = lib.parsecode

def get_list(area_code):

parsecode.argtype = c_char_p

parsecode.restype = c_char_p

result = lib.parsecode(area_code.encode("utf-8"))

return result.decode("utf-8").split(",")

簡單總結

python與go之間的引數傳遞, 處理非int型時需要都轉為對應的c型別

ctypes需要顯式地宣告dll函式的引數和返回期望的資料型別

注意在python3中字串bytes和string的區別

go模組需要//export 宣告外部可呼叫

go處理c的型別是需要顯式轉換

python字典和nametuple互相轉換例子

如果tuple中的元素很多的時候操作起來就比較麻煩,有可能會由於索引錯誤導致出錯。namedtuple物件給tuple命名。下面的例子可以字典和nametuple互相轉換 aa 字典轉化為namedtuple keys list valuse list for key,value in option...

python字典和nametuple互相轉換例子

如果tuple中的元素很多的時候操作起來就比較麻煩,有可能會由於索引錯誤導致出錯。namedtuple物件給tuple命名。下面的例子可以字典和nametuple互相轉換 aa 字典轉化為namedtuple keys list valuse list for key,value in option...

Python和Golang的特點

python 解釋型語言,程式設計師不需要再執行前編譯,再執行時才翻譯,這樣解釋型語言每執行一次就要翻譯一次,效率較低 動態資料型,支援過載運算子,也支援泛型設計,運算子過載,就是對已有的運算子進行重新定義,賦予其中的另一種功能,以適應不同的資料型別,正規化設計就是定義的時候不需要制定型別,在客戶端...