91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Python里面調用Golang代碼的方法

發布時間:2023-05-29 14:04:26 來源:億速云 閱讀:127 作者:栢白 欄目:開發技術

這篇文章主要介紹了在Python里面調用Golang代碼的方法,具有一定借鑒價值,需要的朋友可以參考下。下面就和我一起來看看吧。

1.調用編譯后的動態庫文件,報頭文件錯誤

原因:

不同平臺下編譯的add.so 不能通用,Windows下可以運行的so文件,linux下就不能運行,需要重新編譯linux的so文件;

該報錯可能就是跨平臺使用動態庫文件了,需要重新編譯。

2.編譯的動態庫文件在調用時找不到函數方法

原因:

//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() {
}

如上:在外部調用的兩個函數前的注釋://export Add 和 //export Addstr 不可少,而且注釋符‘//’和‘export’之間不能有空格。在編譯成.so文件的時候,編譯器會尋找這個注釋。為了能正常編譯,我們也必須導入C這個包。

特別注意 //和export 中間不能有空格;該注釋不可忽略

3.python和golang之間的參數傳遞,需要使用C的數據類型進行中間變化

只有int可以不需要轉換,直接在go和C直接互相調用

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

比如string需要用C.char來傳遞,C.GoString(s)可以將C.char類型轉換為string,反之C.CString可以把string類型轉為 *C.char

Python是利用ctypes來跟so模塊進行交互,其中存在著一個代碼的翻譯過程,包括數據類型的翻譯,如果需要傳參獲取接收返回值,需要在golang中將參數按照下表對應,定義成C語言的數據類型。

python,ctypes , c 對應類型參考

python 官方文檔

4.python在入參字符串時還需要使用utf-8進行編碼,裝換為byte類型

# -*- coding:utf-8 -*-
import ctypes
lib = ctypes.cdll.LoadLibrary('./add.so')
result = lib.Add(2020, 1)
print(result)
add = lib.Addstr  #調用go模塊
# 顯式聲明參數和返回的期望類型
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))

再次說明:

go中的*C.char 對應 ctypes 中的c_char_p 對應Python中的bytes object or None

Python與Go之間的參數傳遞, 處理非INT型時需要都轉為對應的C類型

ctypes需要顯式地聲明DLL函數的參數和返回期望的數據類型

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

Go模塊需要//export 聲明外部可調用

Go處理C的類型是需要顯式轉換

編譯:

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

// 這條命令指定了編譯模式為c-shared,編譯完成以后,當前文件夾下面會生成一個add.so文件。這就是我們需要用 Python 載入的文件了。

以上就是在Python里面調用Golang代碼的方法的詳細內容了,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎來億速云行業資訊!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大厂| 正安县| 韶关市| 施甸县| 万山特区| 天全县| 博白县| 吉木乃县| 定结县| 大城县| 三明市| 文化| 眉山市| 宁阳县| 宕昌县| 北海市| 巩留县| 绥棱县| 崇阳县| 阿坝县| 南汇区| 长葛市| 从化市| 乐山市| 萨嘎县| 昂仁县| 梁平县| 南岸区| 德兴市| 丹东市| 麦盖提县| 新田县| 绥化市| 明星| 陇川县| 兴山县| 平遥县| 武冈市| 延安市| 余干县| 北碚区|