<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īng)常警告要升級(jí) pip ?

          共 7581字,需瀏覽 16分鐘

           ·

          2021-03-11 07:38

          作者 | Itamar
          來(lái)源 | Python中文社區(qū)

          更新軟件版本可以修復(fù)bug,增加新功能和提升性能。例如,NumPy 1.20 添加了類型注釋,并在可能的情況下通過(guò)使用SIMD來(lái)提高性能。如果您要安裝NumPy,則可能要安裝最新版本。
          相反,如果您使用的是舊版本的pip,則安裝最新版本的Python軟件包可能會(huì)失敗,或者以較慢,更復(fù)雜的方式進(jìn)行安裝。
          為什么?這是關(guān)于glibc版本控制以及pip如何安裝軟件包的一系列問(wèn)題。
          讓我們看看問(wèn)題到底是什么,如何解決,最后是什么原因造成的。
          舊版本pip的問(wèn)題
          讓我們從Ubuntu 18.04 Docker鏡像開(kāi)始著手。該版本的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:從源代碼編譯
          接下來(lái),讓我們安裝加密程序包,它是PyPI上下載次數(shù)最多的Python程序包之一,每月有數(shù)百萬(wàn)次下載(通常是間接依賴)。
          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開(kāi)發(fā)工具鏈,這將起作用,但非常慢。
          當(dāng)然,這不只是一個(gè)package。PyArrow也會(huì)發(fā)生相同的問(wèn)題,例如:
          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試圖從頭開(kāi)始編譯這些軟件包?為什么我們沒(méi)有獲得二進(jìn)制的、預(yù)編譯的軟件包?
          在考慮第二種故障模式之后,我們將稍等一會(huì)兒找到答案。
          失敗原因#2:舊版本
          接下來(lái),安裝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
          安裝成功!除了訪問(wèn)FilPyPI頁(yè)面(https://pypi.org/project/filprofiler/)外,您都會(huì)看到``0.7.2`的版本很舊。在撰寫(xiě)本文時(shí),F(xiàn)il的最新版本是0.14.1。
          為什么要安裝舊版本?
          pipmanylinux輪子
          NumPyCryptography的許多軟件包都要求在C / C ++ / Cython / Rust / etc中編譯一些代碼。為了節(jié)省您從頭開(kāi)始編譯所有內(nèi)容的需要,維護(hù)人員可以將代碼的編譯版本(“ wheels”)上載到Python Package Index。如果pip碰到適用于您的特定版本的Python和操作系統(tǒng)版本的輪子,它將下載它而不是源代碼。
          對(duì)于Linux,有多種輪子變體:manylinux1manylinux2010manylinux2014。您可以在下載的輪子的文件名中看到正在使用哪個(gè)變體。
          問(wèn)題是:舊版本的pip不支持manylinux2010,當(dāng)然也不支持manylinux2014。Ubuntu 18.04中的pip太舊了,因此它只了解manylinux1。這解釋了我們看到的兩個(gè)問(wèn)題:
          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輪子,而根本沒(méi)有源程序包;因?yàn)閺脑创a構(gòu)建有點(diǎn)棘手,所以我只分發(fā)編譯后的程序包。這意味著pip會(huì)繼續(xù)使用該軟件包的較早版本,直到找到具有manylinux1輪子的軟件包為止。
          解決方案:升級(jí)pip
          為了獲得最新最好的軟件包,而無(wú)需編譯,您需要升級(jí)到最新版本的pip。如何執(zhí)行取決于您的安裝環(huán)境。
          通常,您可以執(zhí)行pip install --upgrade pip來(lái)每天進(jìn)行一次升級(jí)。
          但是,在某些環(huán)境中可能會(huì)出現(xiàn)問(wèn)題。例如,如果您看一下我們?nèi)绾卧赨buntu 18.04中設(shè)置Python,那么我們是通過(guò)系統(tǒng)軟件包安裝pip的。
          問(wèn)題在于,覆蓋系統(tǒng)軟件包中的隨機(jī)文件是一個(gè)壞主意。除非您在環(huán)境中運(yùn)行,否則在必要時(shí)將從頭開(kāi)始重建(例如Docker映像),那么永遠(yuǎn)不要以root或sudo的身份運(yùn)行pip install來(lái)修改系統(tǒng)軟件包。
          相反,在Ubuntu 18.04上,您可以通過(guò)下載獲得pip:
          $ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
          $ python3 get-pip.py
          或者您可以創(chuàng)建一個(gè)virtualenv虛擬環(huán)境,然后通過(guò)執(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語(yǔ)言庫(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è)問(wèn)題的不同解決方案。Conda通過(guò)針對(duì)舊版本的glibc頭文件來(lái)編譯所有的包;基本上在廣泛的Linux發(fā)行版它有一個(gè)自定義編譯安裝設(shè)計(jì)工作。
          PyPI二進(jìn)制輪子通過(guò)編譯舊版本的Linux,以及它的相應(yīng)舊版本的glibc來(lái)解決這個(gè)問(wèn)題。因?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!
          無(wú)論您是建立一個(gè)開(kāi)發(fā)環(huán)境或?qū)懩愕?/span>Dockerfile,請(qǐng)確保升級(jí)pip。否則,你就會(huì)有一個(gè)更難的時(shí)間安裝軟件包。

          學(xué)Python,推薦關(guān)注豬哥

          ??????

          瀏覽 61
          點(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>
                  国产久久色视频 | 国产高潮的视频网站在线观看 | 内射无码8p国产精品 | 一级AV黄色片 | 亚洲精品秘 一区二区三区蜜桃久 |