python包管理(distutils、easy_install、pip、setup.py/requirements.txt、wheel)

distutils、distutils2

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

distutils2 被設計爲 distutils 的替代品,後來這個計劃停滯了。python

setuptools、easy_install、ez_setup.py

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

ez_setup.py 是 setuptools 的安裝工具。ez 是 easy 的縮寫。web

使用方式:服務器

  • 從 PyPI 上安裝一個包:easy_install requests
  • 從網絡文件安裝(下載並安裝):easy_install http://path/to/MyPackage-1.2.3.tgz
  • 從一個本地 .egg 格式文件安裝:easy_install /path/to/MyPackage-1.2.3.egg

distribute 是 setuptools 的一個分支版本,後來又合併到了setuptools。網絡

pip

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

pip 但願再也不使用 Eggs 格式(雖然它支持 Eggs),而更但願採用「源碼發行版」(使用 python setup.py sdist 建立)。ide

pip使用方式:svn

  • pip 能夠利用 requirments.txt 來實現依賴的安裝。
  • 支持 git/svn/hg 等流行的 VCS 系統,能夠直接從 gz 或者 zip 壓縮包安裝,支持搜索包,以及指定服務器安裝等等功能。
  • pip 提供了一個 wheel 子命令來安裝 wheel 包。須要先安裝 wheel 模塊。

setup.py vs requirements.txt

  • Python庫:那些被開發而且爲了其餘人來使用而發佈的東西,你能夠在 PyPI 找到不少Python庫。爲了更好的推廣和傳播 本身,Python庫會包含不少的信息,好比它的名字,版本號,依賴等等。而 setup.py 就是用來提供這些信息的。可是,並無規定你能夠從哪裏獲取這些依賴庫。
  • Python應用:指你所要部署的一些東西,這是區別於咱們以前所講的Python庫的。一個應用常常會有不少依賴,或許會很複雜。這些依賴裏不少沒有一個名字,或者沒有咱們說所的那些信息。這便反映了 pip 的requirements文件所作的事情了。每一個依賴都標明瞭準確的版本號,通常一個Python庫對依賴的版本比較寬鬆,而一個應用則會依賴比較具體的版本號。雖然也許跑其餘 版本的 requests 並不會出錯,可是咱們在本地測試順利後,咱們就會但願在線上也跑相同的版本。執行pip install -r requirements.txt來安裝。

setup.py工具

from setuptools import setup

setup(
    name="MyLibrary",
    version="1.0",
    install_requires=[
        "requests",
        "bcrypt",
    ],
    # ...
)

requirements.txt

# This is an implicit value, here for clarity
--index https://pypi.python.org/simple/

MyPackage==1.0
requests==1.2.0
bcrypt==1.0.2

從抽象到具體

上面這個requirements.txt文件的頭部有一個 --index https://pypi.python.org/simple/ ,通常若是你不用聲明這項,除非你使用的不是PyPI。然而它倒是 requirements.txt 的一個重要部分, 這一行把一個抽象的依賴聲明 requests==1.2.0 轉變爲一個具體的依賴聲明 requests 1.2.0 from pypi.python.org/simple/

setup.py 中,也存在一個 install_requires 表來指定依賴的安裝。這一功能除去了依賴的抽象特性,直接把依賴的獲取url標在了setup.py裏。Link

from setuptools import setup

setup(
    # ...
    dependency_links = [
        "http://packages.example.com/snapshots/",
        "http://example2.com/p/bar-1.0.tar.gz",
    ],
)

wheel

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

wheel 還提供了一個 bdist_wheel 做爲 setuptools 的擴展命令,這個命令能夠用來生成 wheel 包。

pip 提供了一個 wheel 子命令來安裝 wheel 包。

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

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

.whl文件下載:http://www.lfd.uci.edu/~gohlke/pythonlibs/

總結

安裝

  • Use pip to install Python packages from PyPI. Depending how pip is installed, you may need to also install wheel to get the benefit of wheel caching.
  • Use virtualenv, or pyvenv to isolate application specific dependencies from a shared Python installation.
  • If you’re looking for management of fully integrated cross-platform software stacks, consider buildout (primarily focused on the web development community) or Hashdist, or conda (both primarily focused on the scientific community).

打包

  • Use setuptools to define projects and create Source Distributions.
  • Use the bdist_wheel setuptools extension available from the wheel project to create wheels. This is especially beneficial, if your project contains binary extensions.
  • Use twine for uploading distributions to PyPI.

第三方庫安裝路徑

Debian系的特殊路徑:Link

dist-packages instead of site-packages. Third party Python software installed from Debian packages goes into dist-packages, not site-packages. This is to reduce conflict between the system Python, and any from-source Python build you might install manually.

就是說從源代碼手動安裝,將使用site-packages目錄。第三方python軟件安裝到dist-packages目錄,這是爲了減小與操做系統版本的python的衝突,由於Debian系統的許多工具都依賴與系統版本的python。

查找 Python 安裝路徑

>>> from distutils.sysconfig import get_python_lib
>>> print(get_python_lib())
相關文章
相關標籤/搜索