會玩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ù)傳遞進(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對象虫给,再獲取path的長度,使用循環(huán)挨個取出列表中的字符串侠碧,打印出來
我們看到默認(rè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傳遞進(jìn)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虛擬機(jī)是全局的丙笋,意味著線程不安全谢澈,在必要的地方要使用GIL保護(hù)
python會拖慢golang的性能,在性能重要的場合謹(jǐn)慎使用
閱讀相關(guān)文章御板,關(guān)注微信公眾號/知乎專欄/頭條號【碼洞】