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