最近在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。python
嘗試了Docker, vagrant, virtualenv,這幾個東西均可以實現建立一個較爲乾淨的python開發環境,在嘗試了他們以後在這裏分享一下心得,僅供參考,這裏假定讀者也有以上工具的相關經驗,不喜勿噴。git
其實docker的出現,必定程度上就是爲了解決這類問題,我把全部的代碼,庫文件,二進制,配置文件之類的,放到集裝箱裏,一併打包給你,因此你就獲得了一個跟我環境如出一轍的環境,不論是在開發,測試仍是生成環境,對於應用來講,周圍的環境都如出一轍,減小了部署,遷移之類的沒必要要的麻煩。github
若是想要用Docker搭建一個Python開發環境,極爲簡單,只須要去官方下載Python的docker image便可,啓動後,你可能須要安裝一些包,而後記得commit保存下你對鏡像的修改,下次啓動或者把鏡像導給你的同事,獲得的環境都是如出一轍的。docker
可是千萬記得,別把你的代碼直接放到docker image中,這是個很很差的選擇,萬一哪次忘記commit就躲牆角里哭去吧。bash
建議使用-v參數將Host上的開發目錄掛載到容器中,這樣僅僅使用了容器提供的環境,而代碼跟容器自己並無關係。app
OK,說到這,你可能以爲我說了一大堆的廢話,的確廢話,由於這一切在Docker中太簡單了。編輯器
Vagrant是什麼鬼?前段時間我一直想問這個問題,後來用RancherOS,官方推薦用這貨來啓動RancherOS,就試了一下。這貨實際上就是一個Wrapper,你看到的是統一的接口,可是其背後是各類虛擬機,默認是VirtualBox。ide
說白了,用Vagrant享受的服務是虛擬機提供的,其box的概念,實際上就是虛擬機的鏡像文件。Vagrant支持多種provider,VB,VMWare,AWS之類,的確很是方便。它對環境的打包比Docker更兇猛,直接打包的Virtual machine,和Vagrant的配置,想來並非那麼高效,可是的確方即可行。工具
如何在Vagrant上,也就是虛擬技術搭建Python環境,就變得很簡單了,就跟在一個獨立的系統上同樣,又是一大堆的廢話就不在重複了測試
一個致力於給Python提供友好乾淨的開發環境的工具,網上說這廝已經到了機械時代,virtualenv+pip還處於手工時代,可是我的感受比virtualenv+pip還複雜,看了一眼,就不想看了
恩,這傢伙差很少解決了個人問題,因此很是有好感。
Mac上能夠經過pip或代碼安裝virtualenv,不詳細說了。安裝以後,經過命令建立一個新的環境,假定咱們要建立的環境是叫test-cloud-env
,執行以下命令:
$ virtualenv test-cloud-env
這會再當前目錄建立test-cloud-env
這個目錄,並在其下建立bin/
,lib/
,include/
接下來,你會發現有很多東西放在了bin/
目錄下,其中有python的解釋器,以及一些腳本以及咱們的activate
腳本。如今,咱們立刻就要建立一個虛擬的獨立Python開發環境了,一個命令也就搞定,爲了有個直觀的體驗,請看如下實例:
$ 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去搞定就好了
$ cat requirements.txt pexpect pyOpenSSL == 0.15.1 requests $ pip install -r requirements.txt
安裝完成後,一個虛擬的獨立的Python開發環境就OK了。你能夠爲不一樣項目建立不一樣的env。
寫到這就打住就沒什麼意思了,網上不是都搜獲得麼。。。
我比較喜歡Sublime Text,定製性比較高,已經成爲我主要的編輯器了。爲了可以讓編輯器裏的代碼直接在Sublime Text裏使用咱們定製的env執行,咱們得開始定製一個build system。
打開編輯器,Tools
->Build System
->New Build System
,添加代碼:
{ "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的內容
#!/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實在是過輕量級了,以致於沒有必要折騰複用,固然大型項目除外,呵呵。