十月 5, 2008
» 打造一個與世隔離的環境: virtualenv & pyinstall

這裡試著簡述如何在*nix下使用 easy_install & virtualenv & pyinstall 來打包工作環境:

*請務必非常小心地對待自己設的 PYTHONPATH 變數,及 .pydistutils.cfg 檔。

首先 easy_install virtualenv (若你還沒這樣做)。目前 virtualenv 最新為 1.3,若非此版,可下 easy_install -U virtualenv 更新。

到要放新環境的資料夾 (此例為 ~/projects),下 virtualenv (給環境一個名稱,此例為 env)
cd ~/projects
virtualenv --no-site-packages env

此時什麼 .pydistutils.cfg 或 PYTHONPATH 等都得清乾淨,若你兩者都沒設就不必管它。
cd ~/projects/env
source bin/activate
easy_install pyinstall
pyinstall.py (...pylons, django ...所有你想要加入新環境的eggs,用法與easy_install類似)

基本上到這就是一般 virtualenv 的用法,只是改用 pyinstall 置換 easy_install。
再來打包整個環境:
pyinstall.py --freeze=env.req (看一下產出的 env.req 跟妳想像中需要裝到的eggs是不是一樣)

pyinstall.py --bundle env.pybundle -r env.req
         ^^^ 為什麼不是 pyinstall?真的很執著…

大功告成。到下一台要佈署的主機上,一樣做 virtualenv env (然後一樣清乾淨PYTHONPATH等變數)
cd env
easy_install pyinstall

把剛剛的 env.pybundle 複製過來,下
pyinstall.py env.pybundle

即可看到這一連串的咒語所施展的魔法。enjoy

Updated: env.bundle 會被 pyinstall 誤認為要下載的 egg,得以 .pybundle 才會被認得。

參考資料:

附上 env.req 在用 pyinstall.py 裝了 Pylons, SQLAlchemy 與 Genshi 後的結果:
Beaker==1.0.2
FormEncode==1.0.1
Genshi==0.5.1
Mako==0.2.2
Paste==1.7.1
PasteDeploy==1.3.2
PasteScript==1.6.3
Pygments==0.11.1
Pylons==0.9.7rc2
Routes==1.10.1
SQLAlchemy==0.5.0rc1
Tempita==0.2
WebError==0.9
WebHelpers==0.6.1
WebOb==0.9.3
decorator==2.3.1
nose==0.10.3
simplejson==2.0.1
wsgiref==0.1.2
*魔蛋圖片為: Tsja! 之 《Heavenly egg》

九月 25, 2008
» 挺不錯的pyinstall

distutils跟setuptools有些什麼什麼好又有些什麼什麼不好,
其實不少python使用者是心知肚明的,
不過一般來說python programmer除了喜歡pythonic之外,
發佈套件也通常都會遵守發佈python package的標準格式,
發佈setuptools的eggs跟distutils的source tarball
雖然每個python user遵循標準程序的原因未必相同,
不過這似乎已是一種不得不的慣例.

最近在distutils跟setuptools之外出現了新選擇:
Tarek Ziadé的distributeIan Bicking的pyinstall

比較完整也比較吸引我眼球的是Ian Bicking的pyinstall,
一來Ian Bicking的東西向來簡單好用,
二來pyinstall的確解決了一些煩雜的問題,
三來Ian Bicking的社群影響力較大,成為新標準的可能性極高.

pyinstall大致相容於setuptools的easy_install並且提供了一些新的功能跟補強,
我自己認為pyinstall最重要的東西,
是在unix上提供了一個足以取代egg格式的新格式: bundle,
bundle格式有兩個我認為很重要的特點:
第一個就是dependencies include,所有相依的套件全都被放在同一個bundle檔案裡.
第二個是source based.
bundle有點像是一整個相依的freebsd ports或gentoo
ebuild加上其distfiles集合在一起的source整合格式,
所有的source跟編譯及安裝規則都放在同一個檔案裏面,在安裝的同時才進行編譯(.pyc and .so)
所以不像binary格式的eggs需要依版本分2.4的eggs跟2.5的eggs,只要下載同一個檔案就可以安裝了.
當然source based distro/package system的好壞見仁見智, 也會有些限制.
不過至少編譯時間過久這個缺點對於python來講應該是不存在的.
因為大部分的python packages依靠c的部份不多, 另外產生.pyc檔也並不會太慢.

此外pyinstall除了支援同一作者的virtualenv外,
對於整個python環境也有提出了一個解決方法 -- Requirements
事實上對於easy_install base安裝的工具最害怕的就是: 下一次裝不知道其相依的套件還會不會是相同版本.
因為安裝最新版未必是我們最希望的事情, 因為很有可能最新版將我們需要的功能給改變了,我會比較希望能夠有一個版本的控制
Requirements不僅可以由撰寫Requirements file來限制整個相依性的版本,
還可以用pyinstall.py --freeze=require.txt的方法,將整個開發環境的所有python版本套件版號都紀錄下來
方便你移到所以需要新安裝的機器上. 如果再結合上bundle, 幾乎就是非常完美的佈署方案.

pyinstall目前只有0.1.1版, 而且似乎還會有更多加強, 不過我認為這個工具的方便性跟應用的潛力非常大, 值得作個推荐.

更詳細的資訊請參考:

pyinstall:
http://www.openplans.org/projects/topp-engineering/blog/2008/09/24/pyinstall-a-new-hope/
http://pypi.python.org/pypi/pyinstall

distribute:
http://tarekziade.wordpress.com/2008/09/24/distribute-a-setuptools-fork/
http://mail.python.org/pipermail/distutils-sig/2008-September/010031.html
http://bazaar.launchpad.net/~tziade/distribute/trunk/files

biggo.com.tw

A Django site.