Mac上實現對Python的版本切換


最近朋友邀請我幫忙寫個比特幣自動化交易程序,要求的平台是Okex,用Python寫,之前到是自己學過一點自動化交易,不過是MT5的。看了一下Okex提供的API接口,和MT5不一樣,它並沒有現成的IDE,只提供接口,而且我之前也沒接觸過Python,出於試一試的心態,我試着用Python來運行下Okex的示例程序,果然掉進了大坑,費了半天才搞定,看樣子自己的基礎知識還是不夠扎實,我把自己的經歷詳細寫上來,希望能為后人帶來點幫助吧。

首先,通過搜索,我找到了一篇感覺不錯的OKEX的量化交易入門教程博客:https://blog.csdn.net/hellocsz/article/details/81535191

嗯,考慮到沒接觸過python,按文中推薦的書,去下了份盜版的“python編程從入門到實踐”,別的不說,它對環境的配置講得還挺詳細的,先好評一個。MAC默認安裝了Python 2.x的版本,但仔細一看,發現OKEX提供API居然要Python3.4或以上的版本才能用。。。

好在書里詳細地講述了該怎么裝Python3,我復述一下步驟吧:

1.先安裝Homebrew,這個直接按書中操作即可,我沒有碰到問題,注意,書中的xcode-select --install是要你安裝xcode的命令行工具,不是安裝xcode,不用特意去裝個xcode(雖然MAC的開發人員一般都會裝),

2.安裝Python3,也是傻瓜式操作,我沒有碰到問題,略過。

3.安裝個文本編輯器,方便Python編程,書里推薦了Sublime Text,不錯不錯,一條龍服務啊,果斷安裝,還是傻瓜式的,我喜歡。

按照書里教的打了個helloworld,沒問題,正常輸出,可以使用了!

 

好,繼續按上面的博客說的做,去官網申請個API key,簡單,沒難度,對了,我選的權限是只讀 提幣 交易全選的,反正自己的賬戶錢也不多,先試試吧。

隨后博客說API文檔里還能看到代碼示例,有四個后綴為py的文件(Client,httpMD5Util,OkcoinFutureAPI,OkcoinSpotAPI),找了半天,沒有。百度,關鍵詞:okex自動化交易,翻了幾個博客,找到個Github上的站點:https://github.com/okcoin-okex/API-docs-OKEx.com

點進去,看到代碼示例四個大字沒,點進去,嗯,分了REST API和WebSocket API兩種啊,之前的博客提到的似乎是第一種,點進去,點python,出現了5個文件,1個ReadMe幫助,4個正好是要找的后綴為py的Client,httpMD5Util,OkcoinFutureAPI,OkcoinSpotAPI,棒!搞下來,放一個文件夾。

博客里說Client是主程序,好,那就用Sublime Text打開它,先給爸爸看看效果,點擊Tools->build,我TM就知道,果然報錯了。。。(注意,這里apikey和secretkey要打入自己注冊的API key和passphase)

 

又到了最快樂的解題時間,那么問題在哪?看了下,ImportError:No module named http.client是吧?百度,stack over flow,復制問題搜索下,看看有沒有解決方案。喲,第一個就是,不錯不錯,進展挺順利啊,https://stackoverflow.com/questions/12058647/selenium-no-module-named-http-client,一看答復,嗯?這個人說自己之前裝了python3,然后裝python2的時候沒有覆蓋安裝,所以。。。

可是我就要python3.4以后的版本啊,這啥玩意,差評。繼續百度,20分鍾過去了,嗯,沒有進展,這些人都在瞎扯啥,一個能用的方案都沒有。。。

唉還是要爸爸親自出馬啊,我想想,之前測試helloworld也沒報錯啊,那應該不是python不能用,仔細看下錯誤信息,from OKcoinSpotAPI import OKCoinSpot報錯了,看起來應該是從OKcoinSpotAPI.py導入OKCoinSpot,進OKcoinSpotAPI.py看下,發現OKCoinSpot是里面定義的一個類,這應該沒錯,再看OKcoinSpotAPI.py里有from HttpMD5Util import buildMySign,httpGet,httpPost,進HttpMD5Util.py看看,咦,有個import http.client,嗯,應該就是這里錯了,找不到這個模塊,下載下來的文件里沒有叫http的,這應該是系統自帶的網絡通信庫了,可自帶的怎么會找不到呢?之前stack over flow上那個答案提到了python3,那是不是兩個版本沖突了?因為我有兩個版本的python呢,python3庫名改了也許就會報錯,百度一下得到了答案,因為python2.x的版本中http庫和python3.x版本的名字是不一樣的,http是python3.x中的網絡通信庫的名字,那就是說我在Sublime Text編譯的時候用的是Python2.x的版本咯?按照那本書里的說法,通過命令行使用python3時只要把命令中的python換成python3就行了,那么試一下吧:

命令行中,先進入到Client所在目錄,執行python Client.py,嗯,報錯了,結果如下:

和之前的問題一樣,這符合我們的預期,說明之前的錯誤很有可能是因為Sublime Text編譯的時候用了Python2.x的版本。

試一下執行python3 Client.py(注意,這時我已經把apikey和secretkey打進去了,你要是只想測試,可以先不打,先全部注釋,只留最頂上一行:

from OkcoinSpotAPI import OKCoinSpot,看編譯后有沒有報錯),結果如下:

顯然程序運行成功了,下面是獲取的數據,這進一步說明之前報錯是因為python運行的版本不對。

那么問題肯定是出在Sublime Text上了,它肯定編譯的時候默認用了Python2.x的版本。繼續百度,哦😯,找到一種解決思路,網上有把系統終端默認運行的python版本改成python3的方法,我用python --version和python3 --version分別查看了兩個python的版本,分別是2.7.10和3.7.2,如下圖所示:

等修改后,效果是運行python xxx來編譯並運行某個文件時會自動調用python3來做,而執行python --version指令時,打印出來的也會是Python 3.7.2。

我想Sublime Text在調用python編譯的時候本質應該也是通過命令行做的,相當於調用了python xxx而已,那修改完后,應該也會自動用Python 3.7.2。

找到的方法見鏈接:

https://blog.csdn.net/mghhz816210/article/details/73088406/

方法如下:

1.先在命令行中執行open ~/.bash_profile,這個文件在用戶登錄時會被讀取,一般用於配置環境變量。

以前吃過bash_profile的苦頭,這次特意查了點資料,插播一點知乎上搜到的bash_profile的小知識,理解了之后對以后配置環境變量有好處:

鏈接:https://www.zhihu.com/question/30941329,看第一名的 最終答案:(重點)一行往下的內容即可。

2.寫入外部環境變量, export PATH=${PATH}:/Library/Frameworks/Python.framework/Versions/3.4/bin,這是原作者的路徑,然而我的路徑下卻沒有Python.framework文件夾: 

咋辦呢?仔細想想,配置環境變量不就是為了讓系統能夠自動找到python3的啟動文件,鏈接中的第3步:

alias python="/Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4"明顯是在重命名,就是在把路徑下找到的python3啟動文件關聯到python這條命令上,也就是書,只要找到第2步中python3的真實路徑,就能解決這個問題。

繼續百度,發現which python這條命令可以找到python的路徑,那同理,which python3肯定也能找到python3的路徑,試一下: 

路徑找到了,我們去路徑下看看有沒有吧:

咦?根目錄下找不到usr文件夾,難道是“用戶”?點進去還是找不到,繼續百度!找到解決方法:

https://jingyan.baidu.com/article/67508eb40a65b99cca1ce490.html

原來它們都默認隱藏了,用鏈接中的方法二就可以讓它們顯示出來,顯示后我成功找到了python和python3的啟動文件:

嗯,python的似乎沒問題,但python3的種類是“替身”,很明顯,這是個快捷方式,右鍵->顯示原身,現身吧!!!

可以看到,它的本體在個很奇怪的路徑上,實際本體名字則是python3.7。

那就簡單了,把第二步和第三步改成:

第二步:#export PATH=${PATH}:/usr/local/bin
第三步:#alias python="/usr/local/bin/python3"

當然,考慮到已經找到了python3的本體,也可以直接把路徑定位到本體,我試了是可行的,不過方便起見,就按上面的做吧。

現在python命令已經關聯到了python3上,嘗試一下python --version,咦?居然還是python 2.7.10,仔細看一下,哦,忘了第四步:

source ~/.bash_profile

這條指令是讓對bash_profile的改動立刻生效。

好了再測試一下,哇哦,成功了!!python的默認版本已經改到了3.7.2了!

再次用Sublime Text打開Client.py,Tools->build,見證奇跡吧!!!

好吧,又失敗了,結果和之前一模一樣,仍找不到http模塊,圖就不貼了,這說明即使終端默認運行的python版本已經改為了python3,Sublime Text卻一樣用的python2.x的版本,這讓我覺得不可思議,難道它的build不是等價於執行了python xxx么???有點想卸載這個破編輯器了。

繼續百度!!哇哦,在知乎上碰到了一模一樣的問題!

鏈接如下:https://www.zhihu.com/question/42102873

好,按第一名說的試試,他的思路是通過修改sublimeREPL的python配置文件中python解釋器(就是之前一步步找到的python3啟動文件)啟動方式來完成默認啟動python3.

 滿心歡喜地打開preference>browse package control,嗯??里面根本沒有什么SublimeREPL的文件夾吶!

仔細搜索一番,哦😯,原來這是一個插件啊,需要安裝的,安裝起來挺方便的,見下面兩個鏈接:(隨便挑一個按着做就行,不用設置熱鍵)

https://blog.csdn.net/dchen1993/article/details/53307263

https://www.jianshu.com/p/41df9da08f60

裝好后終於見到了Main.sublime-menu,迫不及待地按鏈接中說的,把cmd后的python全改為python3,這下總該行了吧!!Tools->build

一模一樣的錯誤!!

讓我冷靜一下,冷靜一下!繼續百度!

咦?這個方法看起來挺簡單的:

https://blog.csdn.net/qq_32936067/article/details/81627630

呼,它的基本思路是自己定義一個名詞,比如xxx,我們可以為其綁定指定的啟動文件,發一下我的綁定吧:

注意,用灰色那行也可以的,因為它是之前找到的原身,文件名字可以取想取的,比如我選的是python3。隨后Tools->Build System->python3(自己取的名字),代表選它關聯的路徑來啟動編譯並運行。隨后Tools->build,哇,成功了: 

很明顯數據讀出來了,另外可以看到,secretkey那邊我沒填東西,因為讀數據無需密碼,估計下面交易的時候就要填上去了。

 

至此,任務圓滿結束!!!

PS:解決問題花了一上午,打出所有細節花了一晚上。。。在寫這篇文章的時候,我想起以前有段時間用cocos2dx做游戲,完全沒有幫助,網上搜到的信息都支離破碎,很多問題搜不到答案,解決不了,真的是相當痛苦,其實仔細想一下,很多問題自己解決之后不是不願意分享,只是打成文字,尤其是詳細的文字攻略實在太耗時間了。但即使這樣,我還是希望大家能多分享,要知道,把解決方案完整寫出來,不僅可以幫其他人少走彎路,對自己也是一個知識梳理的過程,以后自己碰到同樣問題時可以更快地回憶起解決方法,這其實是個雙贏的選擇。

僅以此文,獻給那些需要的人,我已經盡可能把當時摸索的細節全寫出來了,也希望大家能多多分享,共同進步哈。

另外,要是有高手知道為什么設置Main.sublime-menu那個方法為什么失敗,麻煩告知博主一下,真的是百思不得其解😢。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM