Python打包分發工具setuptools簡介(轉)

做爲Python標準的打包及分發工具,setuptools能夠說至關地簡單易用。它會隨着Python一塊兒安裝在你的機器上。你只需寫一個簡短的setup.py安裝文件,就能夠將你的Python應用打包。本文就會介紹下如何編寫安裝文件及如何打包分發。html

首先,若是你須要另外安裝setuptools,你可使用下面的命令:python

$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python ez_setup.py

第一個安裝文件

接下來讓咱們編寫安裝文件,假設咱們的項目名爲setup-demo,包名爲myapp,目錄結構以下:git

setup-demo/
  ├ setup.py         # 安裝文件
  └ myapp/           # 源代碼
      ├ __init__.py    
      ...

一個最基本的setup.py文件以下:web

執行安裝文件

有了上面的setup.py文件,咱們就能夠打各類包,也能夠將應用安裝在本地Python環境中。app

    1. 建立egg包
$ python setup.py bdist_egg

該命令會在當前目錄下的」dist」目錄內建立一個egg文件,名爲」MyApp-1.0-py2.7.egg」。文件名格式就是」應用名-版本號-Python版本.egg」,我本地Python版本是2.7。同時你會注意到,當前目錄多了」build」和」MyApp.egg-info」子目錄來存放打包的中間結果。eclipse

    1. 建立tar.gz包
$ python setup.py sdist --formats=gztar

同上例相似,只不過建立的文件類型是tar.gz,文件名爲」MyApp-1.0.tar.gz」。工具

    1. 安裝應用
$ python setup.py install

該命令會將當前的Python應用安裝到當前Python環境的」site-packages」目錄下,這樣其餘程序就能夠像導入標準庫同樣導入該應用的代碼了。ui

    1. 開發方式安裝
$ python setup.py develop

若是應用在開發過程當中會頻繁變動,每次安裝還須要先將原來的版本卸掉,很麻煩。使用」develop」開發方式安裝的話,應用代碼不會真的被拷貝到本地Python環境的」site-packages」目錄下,而是在」site-packages」目錄裏建立一個指向當前應用位置的連接。這樣若是當前位置的源碼被改動,就會立刻反映到」site-packages」裏。url

引入非Python文件

上例中,咱們只會將」myapp」包下的源碼打包,若是咱們還想將其餘非Python文件也打包,好比靜態文件(JS,CSS,圖片),應該怎麼作呢?這時咱們要在項目目錄下添加一個」MANIFEST.in」文件夾。假設咱們把全部靜態文件都放在」static」子目錄下,如今的項目結構以下:spa

setup-demo/
  ├ setup.py         # 安裝文件
  ├ MANIFEST.in      # 清單文件
  └ myapp/           # 源代碼
      ├ static/      # 靜態文件目錄    
      ├ __init__.py    
      ...

咱們在清單文件」MANIFEST.in」中,列出想要在包內引入的目錄路徑:

「recursive-include」代表包含子目錄。別急,還有一件事要作,就是在」setup.py」中將」 include_package_data」參數設爲True:

以後再次打包或者安裝,」myapp/static」目錄下的全部文件都會被包含在內。若是你想排除一部分文件,能夠在setup.py中使用」exclude_package_date」參數,好比:

上面的代碼會將全部」.gitignore」文件排除在包外。若是上述」exclude_package_date」對象屬性不爲空,好比」{‘myapp’:[‘.gitignore’]}」,就代表只排除」myapp」包下的全部」.gitignore」文件。

自動安裝依賴

咱們的應用會依賴於第三方的Python包,雖然能夠在說明文件中要求用戶提早安裝依賴包,但畢竟很麻煩,用戶還有可能裝錯版本。其實咱們能夠在setup.py文件中指定依賴包,而後在使用setuptools安裝應用時,依賴包的相應版本就會被自動安裝。讓咱們來修改上例中的setup.py文件,加入」install_requires」參數:

上面的代碼中,咱們聲明瞭應用依賴Flask 0.10及以上版本,和Flask-SQLAlchemy 1.5及以上、2.1及如下版本。setuptools會先檢查本地有沒有符合要求的依賴包,若是沒有的話,就會從PyPI中得到一個符合條件的最新的包安裝到本地。

你們能夠執行下試試,你會發現不但Flask 0.10.1(當前最新版本)被自動安裝了,連Flask的依賴包Jinja2和Werkzeug也被自動安裝了,很方便吧。

若是應用依賴的包沒法從PyPI中獲取怎麼辦,咱們須要指定其下載路徑:

路徑應指向一個egg包或tar.gz包,也能夠是個包含下載地址(一個egg包或tar.gz包)的頁面。我的建議直接指向文件。

自動搜索Python包

以前咱們在setup.py中指定了」packages=[‘myapp’]」,說明將Python包」myapp」下的源碼打包。若是咱們的應用很大,Python包不少怎麼辦。你們看到這個參數是一個列表,咱們固然能夠將全部的源碼包都列在裏面,但確定不少人以爲這樣作很傻。的確,setuptools提供了」find_packages()」方法來自動搜索能夠引入的Python包:

這樣當前項目內全部的Python包都會自動被搜索到並引入到打好的包內。」find_packages()」方法能夠限定你要搜索的路徑,好比使用」find_packages(‘src’)」就代表只在」src」子目錄下搜索全部的Python包。

補充

    • zip_safe參數

決定應用是否做爲一個zip壓縮後的egg文件安裝在當前Python環境中,仍是做爲一個以.egg結尾的目錄安裝在當前環境中。由於有些工具不支持zip壓縮文件,並且壓縮後的包也不方便調試,因此建議將其設爲False:」zip_safe=False」。

    • 描述信息

部分參數提供了更多當前應用的細節信息,對打包安裝並沒有任何影響,好比:

更多內容請參閱setuptools的官方文檔

 

轉自:http://www.bjhee.com/setuptools.html

相關文章
相關標籤/搜索