最近在Mac上使用Python遇到了问题,由于使用了pyOpenSSL库,其同时存在于/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
和/Library/Python/2.7/site-packages
,Mac python的库中,pyOpenSSL版本为0.13,而最新的pyOpenSSL为0.15.1。使用sudo pip install --upgrade pyopenssl==0.15.1
无法将Mac python的库升级,所以无法使用0.15.1的pyopenssl。
尝试了Docker, vagrant, virtualenv,这几个东西都可以实现创建一个较为干净的python开发环境,在尝试了他们之后在这里分享一下心得,仅供参考,这里假定读者也有以上工具的相关经验,不喜勿喷。
1. 基于Docker
其实docker的出现,一定程度上就是为了解决这类问题,我把所有的代码,库文件,二进制,配置文件之类的,放到集装箱里,一并打包给你,所以你就得到了一个跟我环境一模一样的环境,不管是在开发,测试还是生成环境,对于应用来说,周围的环境都一模一样,减少了部署,迁移之类的不必要的麻烦。
如果想要用Docker搭建一个Python开发环境,极为简单,只需要去官方下载Python的docker image即可,启动后,你可能需要安装一些包,然后记得commit保存下你对镜像的修改,下次启动或者把镜像导给你的同事,得到的环境都是一模一样的。
但是千万记得,别把你的代码直接放到docker image中,这是个很不好的选择,万一哪次忘记commit就躲墙角里哭去吧。
建议使用-v参数将Host上的开发目录挂载到容器中,这样仅仅使用了容器提供的环境,而代码跟容器本身并没有关系。
OK,说到这,你可能觉得我说了一大堆的废话,的确废话,因为这一切在Docker中太简单了。
2. 基于Vagrant
Vagrant是什么鬼?前段时间我一直想问这个问题,后来用RancherOS,官方推荐用这货来启动RancherOS,就试了一下。这货实际上就是一个Wrapper,你看到的是统一的接口,但是其背后是各种虚拟机,默认是VirtualBox。
说白了,用Vagrant享受的服务是虚拟机提供的,其box的概念,实际上就是虚拟机的镜像文件。Vagrant支持多种provider,VB,VMWare,AWS之类,的确非常方便。它对环境的打包比Docker更凶猛,直接打包的Virtual machine,和Vagrant的配置,想来并不是那么高效,但是的确方便可行。
如何在Vagrant上,也就是虚拟技术搭建Python环境,就变得很简单了,就跟在一个独立的系统上一样,又是一大堆的废话就不在重复了
3. Buildout
一个致力于给Python提供友好干净的开发环境的工具,网上说这厮已经到了机械时代,virtualenv+pip还处于手工时代,但是个人感觉比virtualenv+pip还复杂,看了一眼,就不想看了
4. Virtualenv
恩,这家伙差不多解决了我的问题,所以非常有好感。
Mac上可以通过pip或代码安装virtualenv,不详细说了。安装之后,通过命令创建一个新的环境,假定我们要创建的环境是叫test-cloud-env
,执行如下命令:
1 |
$ virtualenv test-cloud-env |
这会再当前目录创建test-cloud-env
这个目录,并在其下创建bin/
,lib/
,include/
接下来,你会发现有不少东西放在了bin/
目录下,其中有python的解释器,以及一些脚本以及我们的activate
脚本。现在,我们马上就要创建一个虚拟的独立Python开发环境了,一个命令也就搞定,为了有个直观的体验,请看以下实例:
1 2 3 4 5 |
$ env python -c "import OpenSSL as a; print a.__version__" 0.13.1 $ source test-cloud-env/bin/activate $ env python -c "import OpenSSL as a; print a.__version__" 0.15.1 |
看到区别了吧,启用之前Python使用的是系统的库,启用之后使用新创建的库。
如何给这个env安装依赖库?我使用了requirements.txt来保存需要安装的库及其版本,剩下的交给pip去搞定就行了
1 2 3 4 5 6 7 |
$ cat requirements.txt pexpect pyOpenSSL == 0.15.1 requests $ pip install -r requirements.txt |
安装完成后,一个虚拟的独立的Python开发环境就OK了。你可以为不同项目创建不同的env。
5. something else?
写到这就打住就没什么意思了,网上不是都搜得到么。。。
我比较喜欢Sublime Text,定制性比较高,已经成为我主要的编辑器了。为了能够让编辑器里的代码直接在Sublime Text里使用我们定制的env执行,我们得开始定制一个build system。
打开编辑器,Tools
->Build System
->New Build System
,添加代码:
1 2 3 4 5 |
{ "cmd": ["/path/test-cloud/pyenv.sh", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python" } |
保存为Python-Virtualenv.sublime-build
。
这里用到一个脚本pyenv.sh,这个脚本所做的事情就是激活env,然后执行当前脚本,我们再看看pyenv.sh的内容
1 2 3 4 5 6 7 |
#!/bin/bash pyfile=$1 source /path/to/env/bin/activate # echo $PWD env python -u $pyfile |
记得给这个脚本加个可执行权限。最后在sublime text 的build system里选择Python-Virtualenv
,然后你的脚本就会再自己定制的env中执行了。
另外,对于使用其他环境的Python环境,比如Docker之类,同样可以通过定制Build system来实现远程执行,具体可以参照我的另一篇文章。基本思路是一样的,随意定制。
virtualenv还有个管理器virtualenvwrapper,个人觉得用处不大,因为virtualenv实在是太轻量级了,以至于没有必要折腾复用,当然大型项目除外,呵呵。