Sharing

2012年7月5日 星期四

How to distribute your python package?


想要研究一下要怎麼把自己寫的 Python Module 打包起來, 結果意外發現 Python 這方面的工具也是多條支線發展當中, 這應該是有很多歷史因素吧~

http://stackoverflow.com/questions/6344076/differences-between-distribute-distutils-and-setuptools
http://wokslog.wordpress.com/2011/06/04/distutils-diff/
http://ziade.org/2010/03/03/the-fate-of-distutils-pycon-summit-packaging-sprint-detailed-report/

  • distuils
          最剛開始的工具, 但太陽春
  • Setuptools
          補足了 distutils 許不足的地方, 並且大部份的行為都和 distuils 相容
  • Distribute
          是 setuptools 的一個支線, 但後來因為發展太慢, 所以沒有辦法繼續開發下去
  • Distuils2
          因為前兩者的一些狀況讓人覺得混亂, 所以甘脆開了個完全獨立的案子, 重新開發  distribution 工具,不過同時也儘量和前三者相容。

State of packaging 

結論就是, 目前的狀況還是以  Setuptools or Distribute 為主, 兩者的功能沒有相差很多.下面這個網站就教導了大家應該要如何安排 Folder Structure 以及如何打包你的 module, 照著作就可以了。

Guide
http://guide.python-distribute.org/introduction.html

Distribution 的問題解決之後, 接下來就是 Installer 的問題, 你打包好的東西, 裡面都會有個 setup.py, 一般情況下可以直接執行這個 setup.py 就可以安裝你的 module. 不過還是有些麻煩, 必須要解壓縮, 而且重點是別人要怎麼找到你打包好的 package 呢? Installer 在這裡發揮的角色就是負責幫你找出來要去那裡下載 package, 以及處理相關 dependency, 最後再幫你安裝好, 其實和 Debian/Ubuntu 裡的 apt-get 是一樣的角色
  • easy_install
          http://packages.python.org/distribute/easy_install.html
          早期的 installer, 但目前也還是很多人使用
  • Pip
           http://www.openfoundry.org/tw/tech-column/8536-introduction-of-python-extension-management-tools
           取代 easy_install, 目前最 Popular 的 python 安裝工具, 事實上 Pip 在安裝時還是會用到 easy_install, 只是額外再多提供了一些功能, 像是完整的列出你目前已安裝好的 python package 之類的, 讓你在管理你的 python package 更方便

而不管是 easy_install 或是 Pip, 預設都會到  PyPI http://pypi.python.org/pypi 找尋已發行的 Python 套件

另外我發現 pip install 在執行時, 會加上  --single-version-externally-managed, 這和直接執行 easy_install 產生的結果會有些不同, 主要是資料夾的排放方式
http://stackoverflow.com/questions/368636/questions-about-setuptools-and-alternatives
http://peak.telecommunity.com/DevCenter/setuptools#install-command

Easy_install 會將 egg 資料夾和你的 package 統一擺放在一個資料夾下, 如下圖
/usr/local/lib/python2.7/dist-packages
├── easy-install.pth
└── python_novaclient-2012.2-py2.7.egg      <-------------  統一放在這邊下面
    ├── EGG-INFO                     <--------------  EGG 資料夾
    │   ├── PKG-INFO
    │   ├── ...
    │ 
    └── novaclient                        <---------------  你的 package
        ├── base.py
        ├── client.py
        ├── ...

而用 pip install 產生的結果會如下

/usr/local/lib/python2.7/dist-packages
├── easy-install.pth
├── novaclient                                                      <------------ 你的 package
│   ├── base.py
│   ├── client.py
│   ├── ...
│ 
└── python_novaclient-2012.1.egg-info                  <------------ EGG 資料夾
    ├── PKG-INFO
    ├── ...

雖然資料夾擺放的方式不一樣, 不過在使用上是一樣的, 不會造成問題。
最後再提供一兩個教你怎麼擺放 Folder Structure 的 Template.

Folder Template

2014/03/28 Update

目前最新的教戰手則
https://python-packaging-user-guide.readthedocs.org/en/latest/current.html


沒有留言: