中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中如何實現操作系統兼容性打包

發布時間:2021-10-11 17:25:52 來源:億速云 閱讀:235 作者:柒染 欄目:大數據

今天就跟大家聊聊有關Python中如何實現操作系統兼容性打包,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

有一個這樣的問題:現要用 setuptools 把一個項目打包成 whl 文件,然后 pip install 在 Windows/Linux 兩種操作系統上,但是該項目中有一些依賴庫只有 Windows 上才有(例如 pywinauto、pywingui、pywinrm),那么問題是,如何實現打包文件的可兼容性安裝?

從打包的角度,這個問題的關鍵還是看 setup.py 和 requirements.txt 文件。

關于 Python 的包構建分發和 setup.py 的使用,這里有篇文章 寫得很好,推薦閱讀。另外關于 Python 依賴庫的管理(requirements.txt),這篇文章 詳細比較了 pip、pipreqs、pigar、pip-tools 和 pipdeptree 等工具,也推薦一讀。

有一個比較笨的實現方法:維護兩份 requirements.txt 文件,分別用來打包,然后分發給不同操作系統去使用。

但是這樣會有麻煩:維護兩份依賴文件和兩種包文件,本身就挺費勁的,而在生成過程中,每次還得對它們改名以作區分(注意包名有一定的規范約束,亂改的話,pip 可能識別不出),維護成本就很高。

其實,維護軟件包在不同操作系統的版本,并不少見。如果你曾留意過不同版本 Python 庫文件的話,你會注意到很多庫都會按不同操作系統而分發不同的版本。例如,下面是同一版本號的 Numpy 在不同操作系統上的分發版(https://pypi.org/simple/numpy/):

Python中如何實現操作系統兼容性打包  

可以看出它根據 macos、linux 和 win 三類操作系統及其位數,分成了 5 個版本。維護這么多版本,肯定是一件麻煩事,但是出現了這樣的結果,就意味著 Numpy 官方認為分發不同系統版本是利大于弊的,而且是有辦法實現的。

回到我們的問題,是否有必要像 Numpy 那樣設法打包成多個操作系統定制的包呢?

答案是否定的。主要的原因:
  • Numpy 這么做是因為它是做科學計算的,為了提升效率,它把編譯好的 C 拓展文件打包,從而不需要依賴環境上的 libxxx-devel 之類的庫。如果你編譯安裝過 Python,應該有印象需要安裝 zlib-devel、openssl-devel 和 libffi-devel 之類的系統依賴。但我們前面的問題比較簡單,并不是有不同的編譯依賴(系統級),而只是三方庫依賴不同(項目級)。

  • 另一個主要的原因,Numpy 打包出的不同系統版本,并非簡簡單單地用 setuptools 之類的 Python 庫就能打包,而是要借助標準的鏡像進行構建。例如,manylinux 版本的打包,參見 Github(https://github.com/pypa/manylinux),就需要使用官方提供的 Docker 鏡像。對于我們的問題,顯然不想做到這么麻煩。

簡而言之,根據前面的分析,如果要實現操作系統兼容的打包,維護多份依賴文件、使用不同構建包的方法、維護多系統專用的包,方法可行,但并不是很適用。

如果沒有新的辦法,這不失為一種考慮,但是有沒有別的辦法了呢?

我曾被這個問題困擾過,但是沒有深入去研究解決,直到無意中在loguru 這個用來記錄日志的庫的 setup.py 中看到:

Python中如何實現操作系統兼容性打包  

再翻看大名鼎鼎的requests 庫文件,發現還可以這樣寫:

Python中如何實現操作系統兼容性打包  

兩個示例都是寫在 setup.py 文件中,其實如果我們用 requirements.txt 文件,也可以按這種格式寫,然后再讀取進來。

這種神奇的寫法是怎么回事呢?

它的依據是 2015 年 11 月創建的 PEP-508(以及相關的但已被撤銷或拒絕了的 PEP-390、PEP-426、PEP-459、PEP-496),該 PEP 的主要意圖是增強 pip 等工具查找軟件包的能力。

Python中如何實現操作系統兼容性打包  

比較重要的部分就是跟我們的問題相關的,即對操作系統作區分的標識,相關的有:

Python中如何實現操作系統兼容性打包  

有了這樣的擴展支持,在打包依賴項時,就可以解決兼容性問題了。

例如 colorama 庫,如果我們只在 win32 系統才需要依賴,那么在打包時就可以指定:“colorama>=0.3.4 ; sys_platform=='win32' ”;如果不需要限定 win32 系統,而是在 windows 環境都安裝,那么可以寫成“colorama>=0.3.4 ; platform_system=='Windows' ”。

看完上述內容,你們對Python中如何實現操作系統兼容性打包有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁晋县| 合山市| 罗城| 衡阳市| 汝城县| 邮箱| 万全县| 黄大仙区| 攀枝花市| 德安县| 鲜城| 建平县| 长宁县| 凌云县| 美姑县| 文昌市| 朔州市| 昌都县| 建始县| 高雄市| 弥渡县| 布尔津县| 东光县| 香港| 云林县| 中阳县| 滦南县| 泰来县| 石家庄市| 广灵县| 嘉义市| 筠连县| 怀宁县| 江阴市| 太仆寺旗| 西青区| 八宿县| 邻水| 晋城| 华宁县| 新郑市|