會(huì)玩Go!會(huì)玩Python!嘭!Go-Python!
—— PPAP大叔
Golang是靜態(tài)語言,性能很好,當(dāng)它不那么靈活,不好在運(yùn)行時(shí)動(dòng)態(tài)運(yùn)行代碼。Python是動(dòng)態(tài)語言,非常靈活,但是性能很差。古人云:“魚和熊掌不能兼得”。但是如今有了Go-Python,魚和熊掌也可以兼得。
首先安裝go-python
go get github.com/sbinet/go-python
我們使用下面的代碼啟動(dòng)Python命令行解釋器 go run test.go
代碼很簡(jiǎn)單,先初始化,然后將命令行參數(shù)傳遞進(jìn)Py_Main函數(shù)就可以進(jìn)入Python命令行解釋器,就像直接敲python命令一樣
如果我們執(zhí)行 go run main.go --version就可以查看Python版本信息
接下來我們使用golang打印一下Python環(huán)境的sys.path變量
首先調(diào)用PyImport_ImportModule導(dǎo)入sys包,然后取出path對(duì)象,再獲取path的長度,使用循環(huán)挨個(gè)取出列表中的字符串,打印出來
我們看到默認(rèn)sys.path里面沒有包含當(dāng)前目錄,這意味著不能直接在當(dāng)前目錄導(dǎo)入模塊。
接下來我們?cè)趕ys.path里面加入當(dāng)前目錄
我們?cè)趕ys.path列表的頭部插入了空串,表示將當(dāng)前目錄加入sys.path,于是當(dāng)前目錄成為優(yōu)先查找路徑。
有了上面的代碼,我們可以試一試調(diào)用自定義python模塊了,先寫一個(gè)斐波那契級(jí)數(shù)
這是一個(gè)遞歸版本的實(shí)現(xiàn),n的大小不能超過最大棧深,好,下面使用go調(diào)用它
因?yàn)楫?dāng)前目錄已經(jīng)插入sys.path,我們可以直接使用PyImport_ImportModule導(dǎo)入fib模塊,然后獲取fib函數(shù)對(duì)象,注意函數(shù)也是一個(gè)PyObject對(duì)象。將整數(shù)10傳遞進(jìn)fib函數(shù),得到結(jié)果打印出來。
接下來我們嘗試在自定義模塊里使用requests訪問一下百度首頁,如果能使用第三方Python模塊,那么go-python也就比較Ok了。
touchBaidu返回的是一個(gè)requests.Response對(duì)象,該對(duì)象里的屬性status_code表示返回狀態(tài)碼,content屬性表示返回內(nèi)容。
何時(shí)使用go-python
你需要一個(gè)功能,沒有開源的go實(shí)現(xiàn),但是python有,并且性能不是很重要
你需要一個(gè)腳本語言嵌入到go中,讓go代碼獲得動(dòng)態(tài)能力
你想使用Cython干一些hack的事但是又不想擼C語言
go-python有什么缺點(diǎn)
python虛擬機(jī)是全局的,意味著線程不安全,在必要的地方要使用GIL保護(hù)
python會(huì)拖慢golang的性能,在性能重要的場(chǎng)合謹(jǐn)慎使用
閱讀相關(guān)文章,關(guān)注微信公眾號(hào)/知乎專欄/頭條號(hào)【碼洞】