亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Golang如何調用Python代碼詳解

2020-04-01 18:51:51
字體:
來源:轉載
供稿:網友

前言

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 --cflagspython3.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 的文檔資料其實并不多,所以希望本文能給大家帶來一些幫助。

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成**性毛茸茸| 亚洲系列中文字幕| 国产精品精品一区二区三区午夜版| 国产精品久久久久福利| 成人免费淫片视频软件| 欧美精品九九久久| 久久视频免费观看| 中国日韩欧美久久久久久久久| 国产欧美欧洲在线观看| 精品久久久久久中文字幕一区奶水| 国产精品视频公开费视频| 久久久久久久久中文字幕| 91视频8mav| 另类色图亚洲色图| 91久久国产综合久久91精品网站| 91中文精品字幕在线视频| 亚洲一区二区三区香蕉| 4p变态网欧美系列| 欧美精品国产精品日韩精品| 欧美乱大交xxxxx另类电影| 日韩成人av在线播放| 97视频在线观看网址| 日韩高清欧美高清| 久久久久久久电影一区| 亲爱的老师9免费观看全集电视剧| 98午夜经典影视| 亚洲久久久久久久久久| 欧美日韩国产成人在线观看| 亚洲国产精品人人爽夜夜爽| 欧美日韩国产页| 中文字幕日韩在线视频| 精品视频www| 久久久精品国产亚洲| 欧美巨乳在线观看| 亚洲欧美在线x视频| 久久夜色撩人精品| 中文字幕亚洲综合久久| 亚洲欧洲xxxx| 亚洲欧美一区二区三区久久| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩免费网站| 国产成人免费91av在线| 亚洲国产精品嫩草影院久久| 91精品视频免费观看| 视频一区视频二区国产精品| 日本不卡视频在线播放| 国产欧美亚洲视频| 久久精品欧美视频| 国产区精品在线观看| 亚洲欧洲黄色网| 日韩中文字幕第一页| xvideos国产精品| 欧美日韩免费观看中文| 国产一区二区日韩精品欧美精品| 中文国产成人精品| 久久久久久com| 伊人伊人伊人久久| 国产精选久久久久久| 亚洲影院高清在线| 亚洲丝袜在线视频| 亚洲经典中文字幕| 午夜精品在线观看| 69av成年福利视频| 国产精品久久久久久超碰| 亚洲精品网站在线播放gif| 97视频免费观看| 奇米四色中文综合久久| 九九久久久久久久久激情| 国产视频自拍一区| 久久精品国产一区| 一区三区二区视频| 精品电影在线观看| 国产精品久久一| 欧美日韩视频免费播放| 国产精品v日韩精品| 国产精品久久久久久久久久99| 亚洲国产成人精品久久久国产成人一区| 中文字幕日韩免费视频| 日本三级久久久| 久久精品国产99国产精品澳门| 国产成人精品亚洲精品| 国产精品久久久999| 国产免费观看久久黄| 欧美老少做受xxxx高潮| www.欧美视频| 美日韩精品免费观看视频| 国产91对白在线播放| 亚洲欧美国产高清va在线播| 久久精品亚洲热| 欧美精品18videosex性欧美| 亚洲欧美一区二区精品久久久| 国产极品jizzhd欧美| 欧美www视频在线观看| 高清欧美性猛交xxxx黑人猛交| 中文精品99久久国产香蕉| 亚洲国产小视频| 这里只有精品丝袜| 亚洲激情视频在线| 亚洲国产成人精品一区二区| 精品成人国产在线观看男人呻吟| 亚洲第一网站男人都懂| 精品magnet| 夜夜嗨av一区二区三区免费区| 国产在线观看精品一区二区三区| 国内免费久久久久久久久久久| 亚洲成人黄色在线观看| 日韩美女视频免费在线观看| 国产欧美va欧美va香蕉在线| 成人国产精品久久久| 中文字幕欧美日韩va免费视频| 亚洲激情视频在线| 久久深夜福利免费观看| 亚洲一区二区久久| 欧美精品久久久久久久久久| 欧美成人中文字幕在线| 日韩av在线播放资源| 伊人久久精品视频| 欧美亚洲在线播放| 久久中文精品视频| 亚洲黄色www网站| 国产91精品久久久| 欧美亚洲视频在线观看| 国产精品成人av性教育| 4438全国亚洲精品在线观看视频| 久久久久久久久爱| 亚洲а∨天堂久久精品喷水| 久久久国产精品免费| 欧美激情国产日韩精品一区18| 欧美专区第一页| 亚洲欧美第一页| 青草青草久热精品视频在线观看| 欧美尺度大的性做爰视频| 国产精品久久久久久久久久久不卡| 色久欧美在线视频观看| 日本不卡免费高清视频| 日本精品在线视频| 国产色婷婷国产综合在线理论片a| 日韩欧美第一页| 91探花福利精品国产自产在线| 久久久久久午夜| 精品福利在线观看| 日本精品视频在线播放| 精品久久久久久久久久国产| 91在线观看免费网站| 成人午夜小视频| 欧美成人午夜剧场免费观看| 亚洲人午夜色婷婷| 国产精品视频男人的天堂| 中文字幕精品www乱入免费视频| 91精品国产99久久久久久| 欧美一区二区三区免费视| 久久精品中文字幕免费mv| 亚洲精品欧美日韩专区| 亚洲图片欧美日产| 国产精品夜色7777狼人| 97香蕉久久超级碰碰高清版| 国产精品啪视频| 国产精品高潮呻吟视频| 久久在线免费视频| 狠狠色噜噜狠狠狠狠97| 91精品中文在线| 66m—66摸成人免费视频| 日本人成精品视频在线| 91精品国产高清久久久久久|