Python最全的 pip 使用指南,50% 你可能沒用過

所有的 Python 開發者都清楚,Python 之所以如此受歡迎,能夠在眾多高級語言中,脫穎而出,除了語法簡單,上手容易之外,更多還要歸功於 Python 生態的完備,有數以萬計的 Python 愛好者願意以 Python 為基礎封裝出各種有利於開發的第三方工具包。

這才使用我們能夠以最快的速度開發出一個滿足基本需要的項目,而不是每次都重複造輪子。

Python最全的 pip 使用指南,50% 你可能沒用過

Python 從1991年誕生到現在,已經過去28個年頭了,這其間產生了數以萬計的第三方包,且每個包都會不斷更新,會有越來越多的版本。

當你在一個複雜的項目環境中,如果沒有一個有效的依賴包管理方案,項目的維護將會是一個大問題。

pip 是官方推薦的包管理工具,在大多數開發者眼裡,pip 幾乎是 Python 的標配。

當然也有其他的包管理工具

  • distutils:僅用於打包和安裝,嚴格來講不算是包管理工具
  • setuptools: distutils的增強版,擴展了distutils,提供更多的功能,引入包依賴的管理,easy_install就是它的一個命令行工具,引入了 egg 的文件格式。
  • Pipenv:一個集依賴包管理(pip)及虛擬環境管理(virtualenv)的工具
  • 還有其他的,這裡不一一列出。
  • 今天的主角是 pip ,大家肯定不會陌生。但我相信不少人,只是熟悉幾個常用的用法,而對於其他幾個低頻且實用的用法,卻知之甚少,這兩天,我查閱官方文檔,把這些用法整理了一下,應該是網絡上比較全的介紹。

    1. 查詢軟件包

    查詢當前環境安裝的所有軟件包

    <code>$ pip list/<code>

    查詢 pypi 上含有某名字的包

    $ pip search pkg

    查詢當前環境中可升級的包

    <code>$ pip list --outdated/<code>

    查詢一個包的詳細內容

    <code>$ pip show pkg/<code>

    2. 下載軟件包

    在不安裝軟件包的情況下下載軟件包到本地

    <code>$ pip download --destination-directory /local/wheels -r requirements.txt/<code>

    下載完,總歸是要安裝的,可以指定這個目錄中安裝軟件包,而不從 pypi 上安裝。

    <code>$ pip install --no-index --find-links=/local/wheels -r requirements.txt/<code>

    當然你也從你下載的包中,自己構建生成 wheel 文件

    <code>$ pip install wheel
    $ pip wheel --wheel-dir=/local/wheels -r requirements.txt/<code>

    3. 安裝軟件包

    使用 pip install 可以很方便地從 pypi 上搜索下載並安裝 python 包。

    如下所示

    <code>$ pip install requests/<code>

    這是安裝包的基本格式,我們也可以為其添加更多參數來實現不同的效果。

    3.1 只從本地安裝,而不從 pypi 安裝

    <code># 前提你得保證你已經下載 pkg 包到 /local/wheels 目錄下
    $ pip install --no-index --find-links=/local/wheels pkg/<code>

    3.2 限定版本進行軟件包安裝

    以下三種,對單個 python 包的版本進行了約束

    <code># 所安裝的包的版本為 2.1.2
    $ pip install pkg==2.1.2

    # 所安裝的包必須大於等於 2.1.2
    $ pip install pkg>=2.1.2

    # 所安裝的包必須小於等於 2.1.2
    $ pip install pkg<=2.1.2/<code>

    以下命令用於管理/控制整個 python 環境的包版本

    <code># 導出依賴包列表
    pip freeze >requirements.txt

    # 從依賴包列表中安裝
    pip install -r requirements.txt

    # 確保當前環境軟件包的版本(並不確保安裝)
    pip install -c constraints.txt/<code>

    3.3 限制不使用二進制包安裝

    由於默認情況下,wheel 包的平臺是運行 pip download 命令 的平臺,所以可能出現平臺不適配的情況。

    比如在 MacOS 系統下得到的 pymongo-2.8-cp27-none-macosx_10_10_intel.whl 就不能在 linux_x86_64 安裝。

    使用下面這條命令下載的是 tar.gz 的包,可以直接使用 pip install 安裝。

    比 wheel 包,這種包在安裝時會進行編譯,所以花費的時間會長一些。

    <code># 下載非二進制的包
    $ pip download --no-binary=:all: pkg

    # 安裝非二進制的包
    $ pip install pkg --no-binary/<code>

    3.4 指定代理服務器安裝

    當你身處在一個內網環境中時,無法直接連接公網。這時候你使用pip install 安裝包,就會失敗。

    面對這種情況,可以有兩種方法:

    1. 下載離線包拷貝到內網機器中安裝
    2. 使用代理服務器轉發請求

    第一種方法,雖說可行,但有相當多的弊端

    • 步驟繁雜,耗時耗力
    • 無法處理包的依賴問題

    這裡重點來介紹,第二種方法:

    <code>$ pip install --proxy [user:passwd@]http_server_ip:port pkg/<code>

    每次安裝包就發輸入長長的參數,未免有些麻煩,為此你可以將其寫入配置文件中:$HOME/.config/pip/pip.conf

    對於這個路徑,說明幾點

    • 不同的操作系統,路徑各不相同
    <code># Linux/Unix:
    /etc/pip.conf
    ~/.pip/pip.conf
    ~/.config/pip/pip.conf

    # Mac OSX:

    ~/Library/Application Support/pip/pip.conf
    ~/.pip/pip.conf
    /Library/Application Support/pip/pip.conf

    # Windows:
    %APPDATA%\\pip\\pip.ini
    %HOME%\\pip\\pip.ini
    C:\\Documents and Settings\\All Users\\Application Data\\PyPA\\pip\\pip.conf (Windows XP)
    C:\\ProgramData\\PyPA\\pip\\pip.conf (Windows 7及以後)/<code>
    • 若在你的機子上沒有此文件,則自行創建即可

    如何配置,這邊給個樣例:

    <code>[global]
    index-url = http://mirrors.aliyun.com/pypi/simple/

    # 替換出自己的代理地址,格式為[user:passwd@]proxy.server:port
    proxy=http://xxx.xxx.xxx.xxx:8080

    [install]
    # 信任阿里雲的鏡像源,否則會有警告
    trusted-host=mirrors.aliyun.com/<code>

    3.5 安裝用戶私有軟件包

    很多人可能還不清楚,python 的安裝包是可以用戶隔離的。

    如果你擁有管理員權限,你可以將包安裝在全局環境中。在全局環境中的這個包可被該機器上的所有擁有管理員權限的用戶使用。

    如果一臺機器上的使用者不只一樣,自私地將在全局環境中安裝或者升級某個包,是不負責任且危險的做法。

    面對這種情況,我們就想能否安裝單獨為我所用的包呢?

    慶幸的是,還真有。

    我能想到的有兩種方法:

    使用虛擬環境

    將包安裝在用戶的環境中

    今天的重點是第二種方法,教你如何安裝用戶私有的包?

    命令也很簡單,只要加上 --user 參數,pip 就會將其安裝在當前用戶的 ~/.local/lib/python3.x/site-packages 下,而其他用戶的 python 則不會受影響。

    <code>pip install --user pkg/<code>

    來舉個例子

    <code># 在全局環境中未安裝 requests
    [root@localhost ~]# pip list | grep requests
    [root@localhost ~]# su - wangbm
    [root@localhost ~]#

    # 由於用戶環境繼承自全局環境,這裡也未安裝
    [wangbm@localhost ~]# pip list | grep requests
    [wangbm@localhost ~]# pip install --user requests
    [wangbm@localhost ~]# pip list | grep requests
    requests (2.22.0)
    [wangbm@localhost ~]#


    # 從 Location 屬性可發現 requests 只安裝在當前用戶環境中
    [wangbm@ws_compute01 ~]$ pip show requests
    ---
    Metadata-Version: 2.1
    Name: requests
    Version: 2.22.0
    Summary: Python HTTP for Humans.
    Home-page: http://python-requests.org
    Author: Kenneth Reitz
    Author-email: [email protected]
    Installer: pip
    License: Apache 2.0
    Location: /home/wangbm/.local/lib/python2.7/site-packages
    [wangbm@localhost ~]$ exit
    logout

    # 退出 wangbm 用戶,在 root 用戶環境中發現 requests 未安裝
    [root@localhost ~]$ pip list | grep requests
    [root@localhost ~]$/<code>

    當你身處個人用戶環境中,python 導包時會先檢索當前用戶環境中是否已安裝這個包,已安裝則優先使用,未安裝則使用全局環境中的包。

    驗證如下:

    <code>>>> import sys
    >>> from pprint import pprint
    >>> pprint(sys.path)
    ['',
    '/usr/lib64/python27.zip',
    '/usr/lib64/python2.7',
    '/usr/lib64/python2.7/plat-linux2',
    '/usr/lib64/python2.7/lib-tk',
    '/usr/lib64/python2.7/lib-old',
    '/usr/lib64/python2.7/lib-dynload',
    '/home/wangbm/.local/lib/python2.7/site-packages',
    '/usr/lib64/python2.7/site-packages',
    '/usr/lib64/python2.7/site-packages/gtk-2.0',
    '/usr/lib/python2.7/site-packages',
    '/usr/lib/python2.7/site-packages/pip-18.1-py2.7.egg',
    '/usr/lib/python2.7/site-packages/lockfile-0.12.2-py2.7.egg']

    >>>/<code>

    4. 卸載軟件包

    就一條命令,不再贅述

    <code>$ pip uninstall pkg/<code>

    5. 升級軟件包

    想要對現有的 python 進行升級,其本質上也是先從 pypi 上下載最新版本的包,再對其進行安裝。所以升級也是使用 pip install,只不過要加一個參數 --upgrade。

    <code>$ pip install --upgrade pkg/<code>

    在升級的時候,其實還有一個不怎麼用到的選項 --upgrade-strategy,它是用來指定升級策略。

    它的可選項只有兩個:

    • eager :升級全部依賴包
    • only-if-need:只有當舊版本不能適配新的父依賴包時,才會升級。

    在 pip 10.0 版本之後,這個選項的默認值是 only-if-need,因此如下兩種寫法是一互致的。

    <code>pip install --upgrade pkg1 
    pip install --upgrade pkg1 --upgrade-strategy only-if-need/<code>

    結尾:

    小編近幾年在學習Python!對於想學習Python的朋友們,我想說:很多人學了一個星期就放棄了,為什麼呢?其實沒有好的學習資料給你去學習,你們是很難堅持的,這是小編收集的Python入門學習資料關注,轉發,後臺(我主頁上方)“滴滴”小編“06”,即可免費領取!希望對你們有幫助!


    分享到:


    相關文章: