最近在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 testcloudenv

这会再当前目录创建test-cloud-env这个目录,并在其下创建bin/,lib/,include/

接下来,你会发现有不少东西放在了bin/目录下,其中有python的解释器,以及一些脚本以及我们的activate脚本。现在,我们马上就要创建一个虚拟的独立Python开发环境了,一个命令也就搞定,为了有个直观的体验,请看以下实例:

12345 $ env python c \”import OpenSSL as a; print a.__version__\”0.13.1$ source testcloudenv/bin/activate$ env python c \”import OpenSSL as a; print a.__version__\”0.15.1

看到区别了吧,启用之前Python使用的是系统的库,启用之后使用新创建的库。

如何给这个env安装依赖库?我使用了requirements.txt来保存需要安装的库及其版本,剩下的交给pip去搞定就行了

1234567 $ cat requirements.txt pexpectpyOpenSSL == 0.15.1requests $ pip install r requirements.txt

安装完成后,一个虚拟的独立的Python开发环境就OK了。你可以为不同项目创建不同的env。

5. something else?

写到这就打住就没什么意思了,网上不是都搜得到么。。。

我比较喜欢Sublime Text,定制性比较高,已经成为我主要的编辑器了。为了能够让编辑器里的代码直接在Sublime Text里使用我们定制的env执行,我们得开始定制一个build system。

打开编辑器,Tools->Build System->New Build System,添加代码:

12345 {    \”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的内容

1234567 #!/bin/bash pyfile=$1 source /path/to/env/bin/activate# echo $PWDenv python u $pyfile

记得给这个脚本加个可执行权限。最后在sublime text 的build system里选择Python-Virtualenv,然后你的脚本就会再自己定制的env中执行了。

另外,对于使用其他环境的Python环境,比如Docker之类,同样可以通过定制Build system来实现远程执行,具体可以参照我的另一篇文章。基本思路是一样的,随意定制。

virtualenv还有个管理器virtualenvwrapper,个人觉得用处不大,因为virtualenv实在是太轻量级了,以至于没有必要折腾复用,当然大型项目除外,呵呵。