Python包管理不同方式的區別
學習Python已經有一段時間,經常會遇到安裝各種包的問題,一會 setup.py, 一會 easy_install,一會又是pip,還有一些概念比如distutils, setuptools等等,搞不清楚誰是誰,什麼時候應該用什麼,今天就把這些概念 澄清一下。
distutils
distutils是Python標準庫的一部分,其初衷是為開發者提供一種方便的打包方式, 同時為使用者提供方便的安裝方式。
例如你建立了一個名為foo的包,包含一個foo.py檔案,你想把它打包以便其它人使用。 這時候你需要寫一個setup.py檔案:
from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)
然後執行命令
$python setup.py sdist
然後你發現當前目錄下出現一個名為dist的資料夾,裡面有一個foo-1.0.tar.gz的包。 這個包裡有三個檔案,foo.py, setup.py, PKG-INFO,前兩個檔案和我們之前提到的兩個檔案一樣。 PKG-INFO是關於包的一些資訊。然後你就可以把foo-1.0.tar.gz給別人安裝了。
安裝者要使用這個包時,只需要解壓這個foo-1.0.tar.gz檔案,再執行命令
$python setup install
這個包就會被自動安裝到系統合適的位置。
setuptools
setuptools 是對 distutils 的增強, 尤其是引入了包依賴管理。
setuptools可以為Python包建立 egg檔案, Python 與 egg 檔案的關係,相當於java與jar包的關係。
setuptools 提供的 easy_install 指令碼可以用來安裝 egg包。 另外, easy_install 可以自動從 PyPI 上下載相關的包,並完成安裝,升級。
easy_install 提供了多種安裝,升級Python包的方式,例如:
easy_install SQLObject
easy_install -f http://pythonpaste.org/package_index.html SQLObject
easy_install http://example.com/path/to/MyPackage-1.2.3.tgz
easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg
easy_install --upgrade PyProtocols
後來開發者們覺得 setuptools 開發的太慢了,fork出了 Distribute 專案,然後2013年8月, Distribute 又合併回 setuptools 0.7。
pip
pip 是安裝,管理Python包的工具。它是對 easy_install 的一種增強。 同樣可以從 PyPI 上自動下載,安裝包。
在pip中,
安裝前所有需要的包都要先下載,所以不會出現安裝了一部分,另一部分沒安裝的情況
所有安裝的包會被跟蹤,所以你可以知道為什麼他們被安裝,同時可以解除安裝。
無需使用 egg 檔案。
使用方式簡單:
pip install pkg_name
pip uninstall pkg_name