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那个方法为什么失败,麻烦告知博主一下,真的是百思不得其解😢。。