<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>

          Python 小技巧:如何實現(xiàn)操作系統(tǒng)兼容性打包?

          共 2013字,需瀏覽 5分鐘

           ·

          2020-03-18 23:23

          作者丨豌豆花下貓?
          來源丨Python貓?
          有一個這樣的問題:現(xiàn)要用 setuptools 把一個項目打包成 whl 文件,然后 pip install 在 Windows/Linux 兩種操作系統(tǒng)上,但是該項目中有一些依賴庫只有 Windows 上才有(例如 pywinauto、pywingui、pywinrm),那么問題是,如何實現(xiàn)打包文件的可兼容性安裝?從打包的角度,這個問題的關鍵還是看 setup.py 和 requirements.txt 文件。關于 Python 的包構建分發(fā)和 setup.py 的使用,這里有篇文章 寫得很好,推薦閱讀。另外關于 Python 依賴庫的管理(requirements.txt),這篇文章 詳細比較了 pip、pipreqs、pigar、pip-tools 和 pipdeptree 等工具,也推薦一讀。有一個比較笨的實現(xiàn)方法:維護兩份 requirements.txt 文件,分別用來打包,然后分發(fā)給不同操作系統(tǒng)去使用。但是這樣會有麻煩:維護兩份依賴文件和兩種包文件,本身就挺費勁的,而在生成過程中,每次還得對它們改名以作區(qū)分(注意包名有一定的規(guī)范約束,亂改的話,pip 可能識別不出),維護成本就很高。其實,維護軟件包在不同操作系統(tǒng)的版本,并不少見。如果你曾留意過不同版本 Python 庫文件的話,你會注意到很多庫都會按不同操作系統(tǒng)而分發(fā)不同的版本。例如,下面是同一版本號的 Numpy 在不同操作系統(tǒng)上的分發(fā)版(https://pypi.org/simple/numpy/):2721c48263e8435ff53fe688089b129f.webp可以看出它根據(jù) macos、linux 和 win 三類操作系統(tǒng)及其位數(shù),分成了 5 個版本。維護這么多版本,肯定是一件麻煩事,但是出現(xiàn)了這樣的結果,就意味著 Numpy 官方認為分發(fā)不同系統(tǒng)版本是利大于弊的,而且是有辦法實現(xiàn)的。回到我們的問題,是否有必要像 Numpy 那樣設法打包成多個操作系統(tǒng)定制的包呢?答案是否定的。主要的原因:

          • Numpy 這么做是因為它是做科學計算的,為了提升效率,它把編譯好的 C 拓展文件打包,從而不需要依賴環(huán)境上的 libxxx-devel 之類的庫。如果你編譯安裝過 Python,應該有印象需要安裝 zlib-devel、openssl-devel 和 libffi-devel 之類的系統(tǒng)依賴。但我們前面的問題比較簡單,并不是有不同的編譯依賴(系統(tǒng)級),而只是三方庫依賴不同(項目級)。
          • 另一個主要的原因,Numpy 打包出的不同系統(tǒng)版本,并非簡簡單單地用 setuptools 之類的 Python 庫就能打包,而是要借助標準的鏡像進行構建。例如,manylinux 版本的打包,參見 Github(https://github.com/pypa/manylinux),就需要使用官方提供的 Docker 鏡像。對于我們的問題,顯然不想做到這么麻煩。
          簡而言之,根據(jù)前面的分析,如果要實現(xiàn)操作系統(tǒng)兼容的打包,維護多份依賴文件、使用不同構建包的方法、維護多系統(tǒng)專用的包,方法可行,但并不是很適用。如果沒有新的辦法,這不失為一種考慮,但是有沒有別的辦法了呢?我曾被這個問題困擾過,但是沒有深入去研究解決,直到無意中在loguru 這個用來記錄日志的庫的 setup.py 中看到:997296e7989e32fffa9c8a01f11eada2.webp再翻看大名鼎鼎的requests 庫文件,發(fā)現(xiàn)還可以這樣寫:11d22260e4e876020a6cf7ef1dc75149.webp兩個示例都是寫在 setup.py 文件中,其實如果我們用 requirements.txt 文件,也可以按這種格式寫,然后再讀取進來。這種神奇的寫法是怎么回事呢?它的依據(jù)是 2015 年 11 月創(chuàng)建的 PEP-508(以及相關的但已被撤銷或拒絕了的 PEP-390、PEP-426、PEP-459、PEP-496),該 PEP 的主要意圖是增強 pip 等工具查找軟件包的能力。7528385eadd7ee31317611b4e46fe312.webp比較重要的部分就是跟我們的問題相關的,即對操作系統(tǒng)作區(qū)分的標識,相關的有:b92938e3d407d6024d2b513b85818514.webp有了這樣的擴展支持,在打包依賴項時,就可以解決兼容性問題了。例如 colorama 庫,如果我們只在 win32 系統(tǒng)才需要依賴,那么在打包時就可以指定:“colorama>=0.3.4 ; sys_platform=='win32' ”;如果不需要限定 win32 系統(tǒng),而是在 windows 環(huán)境都安裝,那么可以寫成“colorama>=0.3.4 ; platform_system=='Windows' ”。最終,我們解決了本文開頭的問題。這個問題可能比較小眾,解決起來也沒有什么大文章可做,算是一個小小的 tips 分享給大家吧。bba424997d1bffb550624af6564e0e10.webp

          8ccc3311dc99d0987f3bc07508534ae8.webp

          近期精彩內(nèi)容推薦:??

          508623e1300b77cb5c8167bba4124734.webp?乎高贊:高考700分和700萬怎么選?

          508623e1300b77cb5c8167bba4124734.webp?Python這五個坑,怎么避開?

          508623e1300b77cb5c8167bba4124734.webp?賊好用的Java工具類庫,GitHub星標10k+

          508623e1300b77cb5c8167bba4124734.webp?“新冠牌”啤酒真倒60天賠了20個億




          503e1c12801b557435542490a23a118f.webp

          在看點這里26248f41f99a1abd7f146c65ed9427ed.webp好文分享給更多人↓↓

          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  奇米狠狠色 | 国产精品无码久久久久久久 | 亚洲一二三区电影在线 | 国产精品美女 | 人人鲁人人看人人摸人人操 |