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