Python 包管理工具梳理

原文鏈接:https://blog.zengrong.net/post/2169.html

轉載說明

文章轉載地址:Python 包管理工具解惑

轉載本文僅爲學習目的,若侵權請聯繫本人刪除。

引子

今晚開始學習 scrapy ,在 macbook 上安裝 scrapy 的時候,遇到了 python 包的安裝問題。
又看到了 wheel 之類的字眼,疑惑又上來了,不知道和曾經看過的 egg 到底有什麼區別。
想想用 python 寫工具腳本也好幾年了,但始終沒系統地去了解 python 安裝工具 的知識。
今晚趁着還未淡下去的興致,趕緊搜索瞭解相關的知識。看到一篇總結得簡潔明瞭的文章,轉載過來分享給大家,以共勉。

雖然不是自己寫的,但用 Markdown 編輯器修改樣式,花了不少時間。

一、困惑

作爲一個 Python 初學者,我在包管理上感到相當疑惑(嗯,是困惑)。主要表現在下面幾個方面:

這幾個包管理工具有什麼不同?

  • distutils
  • setuptools
  • distribute
  • disutils2
  • distlib
  • pip

什麼時候該用pip,什麼時候該用 setup.py,它們有關係麼?
easy_installez_setup.pysetup.pysetup.cfg 分別都是幹啥的?
wheelpip 的關係?
Eggwhl 的關係?
如何發佈自己的模塊(發佈到PyPI)?
如何進行模塊的私有發佈(不發佈到PyPI)?
爲了弄清這些問題,我找了許多資料。最後發現最好的資料還是 python 的官方文檔。

下面是閱讀了所有我找到的資料後的一個總結,希望能幫到幾個月後又把這些全部忘光的那個自己。

二、python 包管理工具大亂鬥

我用時間順序來描述亂鬥過程。

1. distutils

distutils 是 python 標準庫的一部分,2000年發佈。使用它能夠進行 python 模塊的 安裝發佈

setup.py 就是利用 distutils 的功能寫成,我們可以看一個簡單的 setup.py 的例子。

在這裏可以看到關於 setupt.py 格式的所有詳細描述:Writing the Setup Script

要安裝一個模塊到當前的 python 環境中,可以使用這個模塊提供的 setup.py 文件:

python setup.py install

下面的代碼會發佈一個 python 模塊,將其打包成 tar.gz 或者 zip 壓縮包:

python setup.py sdist

甚至能打包成 rpm 或者 exe 安裝包:

python setup.py bdist_rpm
python setup.py bdist_wininst

2. setuptools 和 distribute

setuptools 是一個爲了增強 distutils 而開發的集合,2004年發佈。它包含了 easy_install 這個工具。

ez_setup.pysetuptools 的安裝工具。ez 就是 easy 的縮寫。

簡單的說,setuptools 是一個項目的名稱,是基礎組件。而 easy_install是這個項目中提供的工具,它依賴基礎組件工作

爲了方便描述,下面文章中提到的 setuptools 被認爲與 easy_install 同義。

使用 setuptools 可以自動下載、構建、安裝和管理 python 模塊

例如,從 PyPI 上安裝一個包:

easy_install SQLObject

下載一個包文件,然後安裝它:

easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

從一個 .egg 格式安裝:

easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg

distributesetuptools 的一個分支版本。分支的原因可能是有一部分開發者認爲 setuptools 開發太慢了。但現在,distribute 又合併回了 setuptools 中。因此,我們可以認爲它們是同一個東西。事實上,如果你查看一下 easy_install 的版本,會發現它本質上就是 distribute

easy_install --version
distribute 0.6.28

3. Eggs

Eggs 格式是 setuptools 引入的一種文件格式,它使用 .egg 擴展名,用於 Python 模塊的安裝。

setuptools 可以識別這種格式。並解析它,安裝它。

想要詳細瞭解,可以看看這篇:The Quick Guide to Python Eggs

Eggs are to Pythons as Jars are to Java…

4. pip

注意,從此處開始,easy_installsetuptools 不再同義。

pip 是目前 python 包管理的事實標準,2008年發佈。它被用作 easy_install替代品,但是它仍有大量的功能建立在 setuptools 組件之上。

pip希望不再使用 Eggs 格式(雖然它支持 Eggs),而更希望採用“源碼發行版”(使用 python setup.py sdist 創建)。這可以充分利用 Requirements File Format 提供的方便功能。

pip 可以利用 requirments.txt 來實現在依賴的安裝。在 setup.py 中,也存在一個 install_requires 表來指定依賴的安裝。它們的區別在哪裏?可以看這篇文章:setup.py vs requirements.txt中文版)。

pip 支持 git/svn/hg 等流行的 VCS 系統,可以直接從 gz 或者 zip 壓縮包安裝,支持搜索包,以及指定服務器安裝等等功能。

pip vs easy_install 詳細介紹了兩者的不同。它們可以說是各佔勝場,但 pip 明顯優勢更大。

5. wheel

wheel 本質上是一個 zip 包格式,它使用 .whl 擴展名,用於 python 模塊的安裝,它的出現是爲了替代 Eggs

wheel 還提供了一個 bdist_wheel 作爲 setuptools 的擴展命令,這個命令可以用來生成 wheel 包。

pip 提供了一個 wheel 子命令來安裝 wheel 包。當然,需要先安裝 wheel 模塊。

setup.cfg 可以用來定義 wheel 打包時候的相關信息。

Wheel vs Egg 詳細介紹了 wheelEggs 格式的區別,很顯然,wheel 優勢明顯。

Python Wheels 網站展示了使用 Wheels 發行的 python 模塊在 PyPI 上的佔有率。

pypip.in 也支持 wheel

6. distutils2 和 distlib

distutils2 被設計爲 distutils替代品。從2009年開發到2012年。它包含更多的功能,並希望以 packaging 作爲名稱進入 python 3.3 成爲標準庫的一部分。但這個計劃 後來停滯了

distlibdistutils2 的部分,它爲 distutils2/packaging 提供的低級功能增加高級 API,使其便於使用。

這裏 介紹了 distlib 沒有進入 python 3.3 標準庫的一些原因。

因此,可以暫時不必瞭解這兩個工具,靜觀其變即可。

三、工具選擇

如果仔細看過上面的亂鬥內容,我相信你已經清楚當前應該如何選擇了。

對於我這樣剛剛開始的新手來說,自然是使用 pip 而不使用 easy_install 了。

如果發佈模塊,當然是使用 wheel 格式。

四、發佈自己的模塊

對於 python3 程序員來說,當然應該先看這一篇:Distributing Python Modules

另外,Tutorial on Packaging and Distributing Projects 也足夠詳細和官方。

而 Python2 程序員則應該看這篇 Distributing Python Modules

當然,setuptools 的官方文檔也是不錯的教程:Building and Distributing Packages with Setuptools

這篇教程可以用來入門:Sharing Your Labor of Love: PyPI Quick and Dirty

至於如何發佈自己的模塊到 PyPI 或者搭建自己的私有包管理服務器,上面的文章已經講得非常清楚了。

五、引用

上面提到的大部分資料,都是在這裏找到,或者是提到:Python Packaging User Guide

感謝這篇文章,讓我不再糾結,然後又下決心寫了本文繼續糾結:Differences between distribute, distutils, setuptools and distutils2?

這篇文章也比較碎:關於python中的 setup.py,而且比本文範例更多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章