Virtualenv + SublimeText 的Python開發環境

Drinkey發表於2015-07-14

最近在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,執行如下命令:

$ 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。

5. something else?

寫到這就打住就沒什麼意思了,網上不是都搜得到麼。。。

我比較喜歡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實在是太輕量級了,以至於沒有必要折騰複用,當然大型專案除外,呵呵。

相關文章