如何實(shí)現(xiàn)Python調(diào)用Golang代碼詳解
1.調(diào)用編譯后的動(dòng)態(tài)庫(kù)文件,報(bào)頭文件錯(cuò)誤
原因:
不同平臺(tái)下編譯的add.so 不能通用,Windows下可以運(yùn)行的so文件,linux下就不能運(yùn)行,需要重新編譯linux的so文件;
該報(bào)錯(cuò)可能就是跨平臺(tái)使用動(dòng)態(tài)庫(kù)文件了,需要重新編譯。
2.編譯的動(dòng)態(tài)庫(kù)文件在調(diào)用時(shí)找不到函數(shù)方法
原因:
//add.go
package main
import "C"
//export Add
func Add(a, b int) int {
return a + b
}
//export Addstr
func Addstr(a, b *C.char) *C.char {
merge := C.GoString(a) + C.GoString(b)
return C.CString(merge)
}
// go build -buildmode=c-shared -o add.so add.go
func main() {
}如上:在外部調(diào)用的兩個(gè)函數(shù)前的注釋://export Add 和 //export Addstr 不可少,而且注釋符‘//’和‘export’之間不能有空格。在編譯成.so文件的時(shí)候,編譯器會(huì)尋找這個(gè)注釋。為了能正常編譯,我們也必須導(dǎo)入C這個(gè)包。
特別注意 //和export 中間不能有空格;該注釋不可忽略
3.python和golang之間的參數(shù)傳遞,需要使用C的數(shù)據(jù)類型進(jìn)行中間變化
只有int可以不需要轉(zhuǎn)換,直接在go和C直接互相調(diào)用
對(duì)于不同的類型,需要使用cgo中定義的方法轉(zhuǎn)換,具體可以參考golang-cgo文檔。
比如string需要用C.char來(lái)傳遞,C.GoString(s)可以將C.char類型轉(zhuǎn)換為string,反之C.CString可以把string類型轉(zhuǎn)為 *C.char
Python是利用ctypes來(lái)跟so模塊進(jìn)行交互,其中存在著一個(gè)代碼的翻譯過(guò)程,包括數(shù)據(jù)類型的翻譯,如果需要傳參獲取接收返回值,需要在golang中將參數(shù)按照下表對(duì)應(yīng),定義成C語(yǔ)言的數(shù)據(jù)類型。
python,ctypes , c 對(duì)應(yīng)類型參考

4.python在入?yún)⒆址畷r(shí)還需要使用utf-8進(jìn)行編碼,裝換為byte類型
# -*- coding:utf-8 -*-
import ctypes
lib = ctypes.cdll.LoadLibrary('./add.so')
result = lib.Add(2020, 1)
print(result)
add = lib.Addstr #調(diào)用go模塊
# 顯式聲明參數(shù)和返回的期望類型
add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
add.restype = ctypes.c_char_p
str1 = add("abc".encode("utf-8"),'efg'.encode("utf-8"))
print(str1,type(str1))再次說(shuō)明:
go中的*C.char 對(duì)應(yīng) ctypes 中的c_char_p 對(duì)應(yīng)Python中的bytes object or None
Python與Go之間的參數(shù)傳遞, 處理非INT型時(shí)需要都轉(zhuǎn)為對(duì)應(yīng)的C類型
ctypes需要顯式地聲明DLL函數(shù)的參數(shù)和返回期望的數(shù)據(jù)類型
注意在Python3中字符串bytes和string的區(qū)別
Go模塊需要//export 聲明外部可調(diào)用
Go處理C的類型是需要顯式轉(zhuǎn)換
編譯:
go build -buildmode=c-shared -o add.so add.go
// 這條命令指定了編譯模式為c-shared,編譯完成以后,當(dāng)前文件夾下面會(huì)生成一個(gè)add.so文件。這就是我們需要用 Python 載入的文件了。
到此這篇關(guān)于如何實(shí)現(xiàn)Python調(diào)用Golang代碼詳解的文章就介紹到這了,更多相關(guān)Python調(diào)用golang內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python統(tǒng)計(jì)詞頻并繪制圖片(附完整代碼)
這篇文章主要介紹了Python統(tǒng)計(jì)詞頻并繪制圖片(附完整代碼)本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Python3.7實(shí)現(xiàn)中控考勤機(jī)自動(dòng)連接
這篇文章主要為大家詳細(xì)介紹了Python3.7實(shí)現(xiàn)中控考勤機(jī)自動(dòng)連接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
利用Python+PyQt5實(shí)現(xiàn)簡(jiǎn)易瀏覽器的實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于如何利用Python+PyQt5實(shí)現(xiàn)簡(jiǎn)易瀏覽器的相關(guān)資料,Qt 的主要優(yōu)勢(shì)是可以開(kāi)發(fā)跨平臺(tái)的圖形界面程序,基于 Qt 的應(yīng)用能夠借助于各平臺(tái)的原生性在不同類的設(shè)備上運(yùn)行,而無(wú)須修改任何代碼庫(kù),需要的朋友可以參考下2021-07-07
如何通過(guò)Python3和ssl實(shí)現(xiàn)加密通信功能
這篇文章主要介紹了如何通過(guò)Python3和ssl實(shí)現(xiàn)加密通信功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05

