欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何實現(xiàn)Python調(diào)用Golang代碼詳解

 更新時間:2023年05月15日 10:44:55   作者:AbsoluteCuteness  
這篇文章主要介紹了如何實現(xiàn)Python調(diào)用Golang代碼,Python和Golang都是當下非常流行的編程語言,在實際開發(fā)中,我們可能會遇到需要將Python和Golang進行組合使用的場景,感興趣想要詳細了解可以參考下文

1.調(diào)用編譯后的動態(tài)庫文件,報頭文件錯誤

原因:

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

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

2.編譯的動態(tài)庫文件在調(diào)用時找不到函數(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)用的兩個函數(shù)前的注釋://export Add 和 //export Addstr 不可少,而且注釋符‘//’和‘export’之間不能有空格。在編譯成.so文件的時候,編譯器會尋找這個注釋。為了能正常編譯,我們也必須導入C這個包。

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

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

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

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

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

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

python,ctypes , c 對應類型參考

python 官方文檔

4.python在入?yún)⒆址畷r還需要使用utf-8進行編碼,裝換為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))

再次說明:

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

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

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

注意在Python3中字符串bytes和string的區(qū)別

Go模塊需要//export 聲明外部可調(diào)用

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

編譯:

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

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

到此這篇關于如何實現(xiàn)Python調(diào)用Golang代碼詳解的文章就介紹到這了,更多相關Python調(diào)用golang內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • Python二進制文件讀取并轉換為浮點數(shù)詳解

    Python二進制文件讀取并轉換為浮點數(shù)詳解

    這篇文章主要介紹了Python二進制文件讀取并轉換為浮點數(shù)詳解,用python讀取二進制文件,這里主要用到struct包,而這個包里面的方法主要是unpack、pack、calcsize。,需要的朋友可以參考下
    2019-06-06
  • 閉包在python中的應用之translate和maketrans用法詳解

    閉包在python中的應用之translate和maketrans用法詳解

    這篇文章主要介紹了閉包在python中的應用之translate和maketrans用法,是比較實用的技巧,需要的朋友可以參考下
    2014-08-08
  • python筆記:mysql、redis操作方法

    python筆記:mysql、redis操作方法

    下面小編就為大家?guī)硪黄猵ython筆記:mysql、redis操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 詳解python發(fā)送各類郵件的主要方法

    詳解python發(fā)送各類郵件的主要方法

    python中email模塊使得處理郵件變得比較簡單,這篇文章主要介紹了詳解python發(fā)送各類郵件的主要方法,有興趣的可以了解一下。
    2016-12-12
  • pycharm顯示遠程圖片的實現(xiàn)

    pycharm顯示遠程圖片的實現(xiàn)

    這篇文章主要介紹了pycharm顯示遠程圖片的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • python獲取百度熱榜鏈接的實例方法

    python獲取百度熱榜鏈接的實例方法

    在本篇文章里小編給大家整理了關于python獲取百度熱榜鏈接的實例方法,需要的朋友們可以學習參考下。
    2020-08-08
  • Python中MySQLdb和torndb模塊對MySQL的斷連問題處理

    Python中MySQLdb和torndb模塊對MySQL的斷連問題處理

    這篇文章主要介紹了Python中MySQLdb和torndb模塊對MySQL的斷連問題處理,torndb使用起來相對更加簡潔一些,需要的朋友可以參考下
    2015-11-11
  • Python上下文管理器用法及實例解析

    Python上下文管理器用法及實例解析

    這篇文章主要介紹了Python上下文管理器用法及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Django獲取前端數(shù)據(jù)的實現(xiàn)方式

    Django獲取前端數(shù)據(jù)的實現(xiàn)方式

    這篇文章主要介紹了Django獲取前端數(shù)據(jù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python特效之字符成像詳解

    python特效之字符成像詳解

    這篇文章主要為大家介紹了python特效之字符成像,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論