婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang如何調用Python代碼詳解

Golang如何調用Python代碼詳解

熱門標簽:高德地圖標注口訣 中國地圖標注省會高清 西部云谷一期地圖標注 南通如皋申請開通400電話 學海導航地圖標注 浙江高速公路地圖標注 地圖標注的汽車標 江西轉化率高的羿智云外呼系統 廣州呼叫中心外呼系統

前言

Python是時髦的機器學習御用開發語言,Golang是大紅大紫的新時代后端開發語言。Python很適合讓搞算法的寫寫模型,而Golang很適合提供API服務,兩位同志都紅的發紫,這里就介紹一下正確攪基的辦法。

go 中的 cgo 模塊可以讓 go 無縫調用 c 或者 c++ 的代碼,而 python 本身就是個 c 庫,自然也可以由 cgo 直接調用,前提是指定正確的編譯條件,如 Python.h 頭文件(),以及要鏈接的庫文件。本文以 Ubuntu 18.04 作為開發和運行平臺進行演示。

其實在使用 cgo 之前,筆者也考慮過使用 grpc 的方式。比如可以將需要調用的 python 代碼包裝成一個 grpc server 端,然后再使用 go 編寫對應的 client 端,這樣考慮的前提是,go 調用 python 代碼本來就是解一時之困,而且引入語言互操作后,對于項目維護和開發成本控制都有不小的影響,如果直接使用 grpc 生成編程語言無感知的協議文件,將來無論是重構或使用其他語言替換 python 代碼,都是更加方便,也是更加解耦的。所以 grpc 也是一種比較好的選擇。至于通信延遲,老實說既然已經設計語言互操作,本機中不到毫秒級的損失其實也是可以接受的。

接下來進入正題。

Golang調用Python代碼

1. 針對 python 版本安裝 python-dev

sudo apt install python3.6-dev

系統未默認安裝 python3.x 的開發環境,所以假如要通過 cgo 調用 python,需要安裝對應版本的開發包。

2. 指定對應的cgo CFLAGS 和 LDFLAGS 選項

對于未由 c 包裝的 python 代碼,python-dev 包中內置了 python-config 工具用于查看編譯選項。

python3.6-config --cflags

python3.6-config --ldflags

以下是對應的輸出

-I/usr/include/python3.6m -I/usr/include/python3.6m  -Wno-unused-result -Wsign-compare -g -fdebug-prefix-map=/build/python3.6-MtRqCA/python3.6-3.6.6=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O3 -Wall

-L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -L/usr/lib -lpython3.6m -lpthread -ldl  -lutil -lm  -xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions

低版本的 python 也可以在安裝開發包后,使用對應的 python-config 命令打印依賴配置。由于 cgo 默認使用的編譯器不是 gcc ,所以輸出中的部分選項并不受支持,所以最后 cgo 代碼的配置為

//#cgo CFLAGS : -I./ -I/usr/include/python3.6m
//#cgo LDFLAGS: -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -L/usr/lib -lpython3.6m -lpthread -ldl  -lutil -lm
//#include "Python.h"
import "C"

3. 部分示例代碼

3.0 映射 PyObject

type PyObject struct {
 ptr *C.PyObject
}

func togo(obj *C.PyObject) *PyObject {
 if obj == nil {
  return nil
 }
 return PyObject{ptr: obj}
}

func topy(self *PyObject) *C.PyObject {
 if self == nil {
  return nil
 }
 return self.ptr
}

3.1 python 環境的啟動與終結

func Initialize() error {
 if C.Py_IsInitialized() == 0 {
  C.Py_Initialize()
 }
 if C.Py_IsInitialized() == 0 {
  return fmt.Errorf("python: could not initialize the python interpreter")
 }

 if C.PyEval_ThreadsInitialized() == 0 {
  C.PyEval_InitThreads()
 }
 if C.PyEval_ThreadsInitialized() == 0 {
  return fmt.Errorf("python: could not initialize the GIL")
 }

 return nil
}

func Finalize() error {
 C.Py_Finalize()
 return nil
}

3.2 包路徑與模塊導入

func InsertExtraPackageModule(dir string) *PyObject {
 sysModule := ImportModule("sys")
 path := sysModule.GetAttrString("path")

 cstr := C.CString(dir)
 defer C.free(unsafe.Pointer(cstr))
 C.PyList_Insert(topy(path), C.Py_ssize_t(0), topy(togo(C.PyBytes_FromString(cstr))))

 return ImportModule(dir)
}

func ImportModule(name string) *PyObject {
 c_name := C.CString(name)
 defer C.free(unsafe.Pointer(c_name))
 return togo(C.PyImport_ImportModule(c_name))
}

func (self *PyObject) GetAttrString(attr_name string) *PyObject {
 c_attr_name := C.CString(attr_name)
 defer C.free(unsafe.Pointer(c_attr_name))
 return togo(C.PyObject_GetAttrString(self.ptr, c_attr_name))
}

3.3 數據類型轉換

func PyStringFromGoString(v string) *PyObject {
 cstr := C.CString(v)
 defer C.free(unsafe.Pointer(cstr))
 return togo(C.PyBytes_FromString(cstr))
}

func PyStringAsGoString(self *PyObject) string {
 c_str := C.PyBytes_AsString(self.ptr)
 return C.GoString(c_str)
}

...

可以看到形似 C.Py* 的方法都是由 cgo 模塊編譯調用的,這些方法也是 python 暴露的C-API ,而這里的示例就到此為止,其他諸如調用 python 模塊方法的功能文檔里也描述得十分詳細,盡管實施起來仍然有些麻煩。

但是請注意 C-API 的 2.x 與 3.x 版本仍有不同,比如 2.x 版本中的字符串操作類型 PyString_* 在 3.x 中便被重命名為 PyBytes_* 。

關注過 go 與 python 互操作功能的同學應該注意到上述的示例代碼部分來自 go-python 這個開源項目,有興趣的同學也可以關注一下。 這個項目基于 python2.7 ,其中暴露的 api 諸如字符串轉換也是基于 python2.x 版本,所以針對于更流行的 python3.x 項目,大家就需要自己按照上文方法做一些修改了。

實際工作中,語言的互操作場景確實很讓人感覺頭疼,而 cgo 的文檔資料其實并不多,所以希望本文能給大家帶來一些幫助。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • python 調用API接口 獲取和解析 Json數據
  • python和js交互調用的方法
  • 通過實例解析Python調用json模塊
  • Python如何調用JS文件中的函數
  • json跨域調用python的方法詳解
  • Nodejs中調用系統命令、Shell腳本和Python腳本的方法和實例
  • python調用攝像頭的示例代碼
  • 使用C++調用Python代碼的方法詳解
  • 詳解C++調用Python腳本中的函數的實例代碼
  • Python調用JavaScript代碼的方法

標簽:吐魯番 常州 保定 許昌 東營 德宏 貴州 曲靖

巨人網絡通訊聲明:本文標題《Golang如何調用Python代碼詳解》,本文關鍵詞  Golang,如何,調用,Python,代碼,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang如何調用Python代碼詳解》相關的同類信息!
  • 本頁收集關于Golang如何調用Python代碼詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品福利影院| 久久国产免费看| 亚洲一区二区av在线| 成人午夜av电影| 日韩视频在线永久播放| 亚洲成人免费视| 欧美另类z0zxhd电影| 一区二区三区精品视频| 不卡视频一二三四| 亚洲欧美一区二区三区久本道91 | 国产91综合网| 久久久精品中文字幕麻豆发布| 青青草国产成人99久久| 884aa四虎影成人精品一区| 成人激情免费电影网址| 中文一区二区完整视频在线观看| 国产成都精品91一区二区三| 久久女同性恋中文字幕| 97久久人人超碰| 精品国产一区二区三区av性色| 日本成人超碰在线观看| 欧美xxxxxxxxx| 国产成人在线看| 亚洲欧美综合网| 欧美高清视频不卡网| 紧缚奴在线一区二区三区| 久久久久国产免费免费| 一本到不卡免费一区二区| 蜜桃视频在线观看一区| 欧美激情一区三区| 91精品国产91综合久久蜜臀| 国产精品亚洲а∨天堂免在线| 国产精品成人免费| 精品久久国产字幕高潮| 91欧美一区二区| 九色|91porny| 丝袜亚洲另类欧美| 亚洲精品一二三| 最新中文字幕一区二区三区| 日韩欧美一二三区| 欧美手机在线视频| 91美女片黄在线| 91丨九色丨尤物| 9久草视频在线视频精品| 国产一区二区在线看| 久久99精品久久久久婷婷| 色婷婷久久久亚洲一区二区三区| 国内精品在线播放| 精品一区二区三区在线观看国产 | 欧美成人在线直播| 欧美一区午夜精品| 精品国产一区二区三区忘忧草| 日韩欧美综合一区| 久久亚洲免费视频| 国产精品天美传媒沈樵| 中文字幕一区二区三区乱码在线 | 亚洲国产高清aⅴ视频| 精品国产污网站| 国产视频不卡一区| 日韩美女啊v在线免费观看| 亚洲视频香蕉人妖| 亚洲丝袜美腿综合| 亚洲成在人线在线播放| 国产一区高清在线| 97精品国产97久久久久久久久久久久| eeuss鲁片一区二区三区在线观看| 欧美丝袜丝交足nylons| 久久精品夜夜夜夜久久| 亚洲精品成a人| 国产综合久久久久久久久久久久 | 亚洲柠檬福利资源导航| 国产盗摄精品一区二区三区在线| 精品一区二区成人精品| 99国内精品久久| 精品国产一区二区三区四区四 | 精品一区二区三区在线播放视频| 国产精品一区二区你懂的| 在线观看亚洲一区| 2020日本不卡一区二区视频| 日韩一区日韩二区| 日韩激情视频在线观看| av网站免费线看精品| 精品99一区二区| 久久99久久99小草精品免视看| 91麻豆精品在线观看| 欧美国产精品v| 国产精品77777| 精品国产sm最大网站| 轻轻草成人在线| 69av一区二区三区| 亚洲一区二区三区美女| 欧美在线一区二区| 亚洲成在线观看| 91精品国产91久久综合桃花| 亚洲午夜激情网页| 久久久夜色精品亚洲| 另类欧美日韩国产在线| 午夜精品福利一区二区三区av| 亚洲精品一区二区三区影院| 不卡一区中文字幕| 欧美日韩国产电影| 欧美日韩一二三区| 93久久精品日日躁夜夜躁欧美| 亚洲私人黄色宅男| 国产麻豆视频精品| 99re热视频精品| 国产欧美一区二区三区沐欲| 欧美日本在线视频| 成人av网在线| 一区二区三区蜜桃网| 欧美一区二区三区在线视频| 久久国产精品区| 亚洲美女区一区| 日韩一区二区中文字幕| av成人老司机| 日韩精品电影在线观看| 福利一区二区在线| 日本韩国欧美一区| 精品在线观看视频| 亚洲一二三四在线观看| 久久一留热品黄| 欧洲av在线精品| 国产精品影视天天线| 亚洲一二三四在线观看| 国产视频一区不卡| 久久午夜电影网| 6080日韩午夜伦伦午夜伦| 日本精品视频一区二区| 成人av动漫在线| 成人avav影音| 91色.com| 97久久精品人人做人人爽50路| 美女在线一区二区| 亚洲福利国产精品| 亚洲精品午夜久久久| 亚洲色图在线播放| 亚洲欧美日韩人成在线播放| 亚洲国产成人私人影院tom| 欧美激情综合网| 亚洲欧美国产高清| 一区二区三区**美女毛片| 一区二区日韩av| 伦理电影国产精品| 国产在线精品免费| 成人一二三区视频| 色呦呦国产精品| 欧美日韩久久久| 国产亚洲精品7777| 亚洲婷婷综合久久一本伊一区| 亚洲品质自拍视频| 久久精品av麻豆的观看方式| 国产黑丝在线一区二区三区| 国产成人福利片| 欧美日韩亚洲综合一区 | 欧美三级欧美一级| 91精品国产一区二区| 欧美激情综合网| 婷婷一区二区三区| 成人深夜福利app| 日韩一区二区视频在线观看| 欧美一区二区视频免费观看| 国产亚洲一本大道中文在线| 日韩福利视频导航| 99综合电影在线视频| 欧美精品视频www在线观看| 亚洲三级电影全部在线观看高清| 日本欧美在线观看| 欧美日韩色综合| 亚洲四区在线观看| 国产综合色视频| 欧美日韩在线播放三区| 亚洲欧美一区二区三区孕妇| 久久99国产精品尤物| 69堂精品视频| 亚洲高清视频的网址| 97久久精品人人做人人爽| 国产精品久久久久婷婷| 国产成人丝袜美腿| 国产日韩视频一区二区三区| 美女视频黄免费的久久 | 精品久久久久久综合日本欧美| 一区二区三区在线高清| 91行情网站电视在线观看高清版| 国产精品欧美一级免费| 91免费精品国自产拍在线不卡| 综合av第一页| 欧美日韩国产三级| 奇米一区二区三区| 久久一区二区三区国产精品| 精品一区二区三区不卡| 国产欧美日韩精品a在线观看| 国产黄人亚洲片| 亚洲欧美一区二区三区极速播放| 91国偷自产一区二区三区成为亚洲经典| 亚洲综合视频在线| 欧美一卡2卡三卡4卡5免费| 免费成人你懂的| 国产精品―色哟哟| 制服丝袜成人动漫| 色综合久久久久久久久|