<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為什么你需要升級(jí) pip ?

          共 7618字,需瀏覽 16分鐘

           ·

          2021-03-04 00:07

          更新軟件版本可以修復(fù)bug,增加新功能和提升性能。例如,NumPy 1.20 添加了類型注釋,并在可能的情況下通過使用SIMD來提高性能。如果您要安裝NumPy,則可能要安裝最新版本。
          相反,如果您使用的是舊版本的pip,則安裝最新版本的Python軟件包可能會(huì)失敗,或者以較慢,更復(fù)雜的方式進(jìn)行安裝。
          為什么?這是關(guān)于glibc版本控制以及pip如何安裝軟件包的一系列問題。
          讓我們看看問題到底是什么,如何解決,最后是什么原因造成的。
          舊版本pip的問題
          讓我們從Ubuntu 18.04 Docker鏡像開始著手。該版本的Ubuntu在2018年4月發(fā)布,安裝有Python 3.6和pip 9 版本。
          [itamarst@blake dev]$ docker run -it ubuntu:18.04
          root@1a43d55f0524:/# apt-get update
          ...
          root@1a43d55f0524:/# apt-get install --no-install-recommends python3 python3-pip
          ...
          root@1a43d55f0524:/# pip3 --version
          pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
          目前為止,事情進(jìn)展順利。
          失敗原因#1:從源代碼編譯
          接下來,讓我們安裝加密程序包,它是PyPI上下載次數(shù)最多的Python程序包之一,每月有數(shù)百萬次下載(通常是間接依賴)。
          root@1a43d55f0524:/# pip3 install cryptography
          Collecting cryptography
            Downloading https://files.pythonhosted.org/packages/fa/2d/2154d8cb773064570f48ec0b60258a4522490fcb115a6c7c9423482ca993/cryptography-3.4.6.tar.gz (546kB)
              100% |################################| 552kB 1.4MB/s 
              Complete output from command python setup.py egg_info:
              Traceback (most recent call last):
                File "<string>", line 1, in <module>
              ModuleNotFoundError: No module named 'setuptools'
              
              ----------------------------------------
          Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-6jesygn0/cryptography/
          程序進(jìn)展不是很順利。
          這個(gè)錯(cuò)誤意味著pip要我們編譯軟件包;如果我們安裝了setuptools,編譯器和Python開發(fā)工具鏈,這將起作用,但非常慢。
          當(dāng)然,這不只是一個(gè)package。PyArrow也會(huì)發(fā)生相同的問題,例如:
          root@1a43d55f0524:/# pip3 install pyarrow
          Collecting pyarrow
            Downloading https://files.pythonhosted.org/packages/62/d3/a482d8a4039bf931ed6388308f0cc0541d0cab46f0bbff7c897a74f1c576/pyarrow-3.0.0.tar.gz (682kB)
              100% |################################| 686kB 1.1MB/s 
              Complete output from command python setup.py egg_info:
              Traceback (most recent call last):
                File "<string>", line 1, in <module>
              ModuleNotFoundError: No module named 'setuptools'
              
              ----------------------------------------
          Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-heq6zwd7/pyarrow/
          為什么pip試圖從頭開始編譯這些軟件包?為什么我們沒有獲得二進(jìn)制的、預(yù)編譯的軟件包?
          在考慮第二種故障模式之后,我們將稍等一會(huì)兒找到答案。
          失敗原因#2:舊版本
          接下來,安裝Fil,Python內(nèi)存分析器https://pythonspeed.com/products/filmemoryprofiler/。
          root@1a43d55f0524:/# pip3 install filprofiler
          Collecting filprofiler
            Downloading https://files.pythonhosted.org/packages/e3/a2/843e7b5f1aba27effb0146c7e564e2592bfc9344a8c8ef0d55245bd47508/filprofiler-0.7.2-cp36-cp36m-manylinux1_x86_64.whl (565kB)
              100% |################################| 573kB 1.8MB/s 
          Installing collected packages: filprofiler
          Successfully installed filprofiler-0.7.2
          安裝成功!除了訪問FilPyPI頁(yè)面(https://pypi.org/project/filprofiler/)外,您都會(huì)看到``0.7.2`的版本很舊。在撰寫本文時(shí),F(xiàn)il的最新版本是0.14.1。
          為什么要安裝舊版本?
          pipmanylinux輪子
          NumPyCryptography的許多軟件包都要求在C / C ++ / Cython / Rust / etc中編譯一些代碼。為了節(jié)省您從頭開始編譯所有內(nèi)容的需要,維護(hù)人員可以將代碼的編譯版本(“ wheels”)上載到Python Package Index。如果pip碰到適用于您的特定版本的Python和操作系統(tǒng)版本的輪子,它將下載它而不是源代碼。
          對(duì)于Linux,有多種輪子變體:manylinux1manylinux2010manylinux2014。您可以在下載的輪子的文件名中看到正在使用哪個(gè)變體。
          問題是:舊版本的pip不支持manylinux2010,當(dāng)然也不支持manylinux2014。Ubuntu 18.04中的pip太舊了,因此它只了解manylinux1。這解釋了我們看到的兩個(gè)問題:
          1、如果您查看PyPI上PyArrow 3.0.0的可用文件列表(https://pypi.org/project/pyarrow/3.0.0/#files),您會(huì)看到只有很多linux2010linux2014的輪子。因此,pip會(huì)回退到需要編譯的源代碼包。
          2、如果檢查Fil的PyPI文件(https://pypi.org/project/filprofiler/0.14.1/#files),則會(huì)看到有manylinux2010輪子,而根本沒有源程序包;因?yàn)閺脑创a構(gòu)建有點(diǎn)棘手,所以我只分發(fā)編譯后的程序包。這意味著pip會(huì)繼續(xù)使用該軟件包的較早版本,直到找到具有manylinux1輪子的軟件包為止。
          解決方案:升級(jí)pip
          為了獲得最新最好的軟件包,而無需編譯,您需要升級(jí)到最新版本的pip。如何執(zhí)行取決于您的安裝環(huán)境。
          通常,您可以執(zhí)行pip install --upgrade pip來每天進(jìn)行一次升級(jí)。
          但是,在某些環(huán)境中可能會(huì)出現(xiàn)問題。例如,如果您看一下我們?nèi)绾卧赨buntu 18.04中設(shè)置Python,那么我們是通過系統(tǒng)軟件包安裝pip的。
          問題在于,覆蓋系統(tǒng)軟件包中的隨機(jī)文件是一個(gè)壞主意。除非您在環(huán)境中運(yùn)行,否則在必要時(shí)將從頭開始重建(例如Docker映像),那么永遠(yuǎn)不要以root或sudo的身份運(yùn)行pip install來修改系統(tǒng)軟件包。
          相反,在Ubuntu 18.04上,您可以通過下載獲得pip:
          $ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
          $ python3 get-pip.py
          或者您可以創(chuàng)建一個(gè)virtualenv虛擬環(huán)境,然后通過執(zhí)行pip install --upgrade pip升級(jí)其pip:
          root@1a43d55f0524:/# python3 -m venv myvenv
          root@1a43d55f0524:/# . myvenv/bin/activate
          (myvenv) root@1a43d55f0524:/# pip --version
          pip 9.0.1 from /myvenv/lib/python3.6/site-packages (python 3.6)
          (myvenv) root@1a43d55f0524:/# pip install --upgrade pip
          Collecting pip
            Using cached https://files.pythonhosted.org/packages/fe/ef/60d7ba03b5c442309ef42e7d69959f73aacccd0d86008362a681c4698e83/pip-21.0.1-py3-none-any.whl
          Installing collected packages: pip
            Found existing installation: pip 9.0.1
              Uninstalling pip-9.0.1:
                Successfully uninstalled pip-9.0.1
          Successfully installed pip-21.0.1
          現(xiàn)在,我們有了一個(gè)更新后的pip,我們可以輕松地安裝最新版本的cryptographyfilprofiler
          (myvenv) root@1a43d55f0524:/# pip install cryptography filprofiler
          Collecting cryptography
            Downloading cryptography-3.4.6-cp36-abi3-manylinux2014_x86_64.whl (3.2 MB)
               |################################| 3.2 MB 4.5 MB/s 
          ...
          Installing collected packages: pycparser, threadpoolctl, cffi, filprofiler, cryptography
          Successfully installed cffi-1.14.5 cryptography-3.4.6 filprofiler-0.14.1 pycparser-2.20 threadpoolctl-2.1.0
          注意,我們下載了包含cryptographymanylinux2014軟件包。
          為什么會(huì)有這么多Linux版本存在?
          Linux上已編譯的Python擴(kuò)展鏈接到標(biāo)準(zhǔn)C語言庫(kù),特別的是它們鏈接到GNU Libc(又名glibc)。您可以使用ldd實(shí)用工具查看可執(zhí)行文件或共享庫(kù)鏈接到哪些庫(kù):
          root@1a43d55f0524:/# cd myenv/lib/python3.6/site-packages
          root@1a43d55f0524:/# ldd cryptography/hazmat/bindings/_openssl.abi3.so 
                  linux-vdso.so.1 (0x00007ffdbea7b000)
                  libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fba7b1bf000)
                  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fba7adce000)
                  /lib64/ld-linux-x86-64.so.2 (0x00007fba7b7b0000)
          注意,編譯后的Python擴(kuò)展尤其依賴于/lib/x86_64-linux-gnu/libc.so.6,即glibc。
          如果您用glibc的較新版本編譯代碼,它可能不需要在舊版本提供新的API或符號(hào)。這意味著你的代碼不會(huì)在舊的Linux發(fā)行版上運(yùn)行。
          有許多對(duì)這個(gè)問題的不同解決方案。Conda通過針對(duì)舊版本的glibc頭文件來編譯所有的包;基本上在廣泛的Linux發(fā)行版它有一個(gè)自定義編譯安裝設(shè)計(jì)工作。
          PyPI二進(jìn)制輪子通過編譯舊版本的Linux,以及它的相應(yīng)舊版本的glibc來解決這個(gè)問題。因?yàn)樗轻槍?duì)舊版本編譯的,它會(huì)與任何新版本兼容工作。
          • manylinux1包建在CentOS 5。
          • manylinux2010包建在CentOS 6。
          • manylinux2014軟件包都建立在CentOS 7上。
          每個(gè)新版本都需要對(duì)應(yīng)的新發(fā)布的pip。你可以學(xué)到更多的PEP-571PEP-599。
          升級(jí)您的pip!
          無論您是建立一個(gè)開發(fā)環(huán)境或?qū)懩愕?/span>Dockerfile,請(qǐng)確保升級(jí)pip。否則,你就會(huì)有一個(gè)更難的時(shí)間安裝軟件包。


          更多閱讀



          2020 年最佳流行 Python 庫(kù) Top 10


          2020 Python中文社區(qū)熱門文章 Top 10


          5分鐘快速掌握 Python 定時(shí)任務(wù)框架

          特別推薦





          點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品无码一区二区三区四区久久久 | 国产AV福利 | 日皮视频在线免费看 | 大香蕉日韩在线 | 熟老女人色 |