Python 小技巧:如何實現操作系統相容性打包?

来源:https://www.cnblogs.com/pythonista/archive/2020/03/17/12514005.html
-Advertisement-
Play Games

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


有一個這樣的問題:現要用 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/):

可以看出它根據 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 中看到:

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

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

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

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

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

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

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

最終,我們解決了本文開頭的問題。這個問題可能比較小眾,解決起來也沒有什麼大文章可做,算是一個小小的 tips 分享給大家吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、 1.下載安裝chrome+chrome driver 2.selenium​操作主要分為兩類: (1)得到UI元素 find_element_by_id:通過id值來獲取元素 find_elements_by_name(下麵都同理) find_elements_by_xpath find_el ...
  • 本篇博客主要詳細介紹朴素貝葉斯模型。首先貝葉斯分類器是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類器。而朴素貝葉斯分類器是貝葉斯分類器中最簡單,也是最常見的一種分類方法。並且,朴素貝葉斯演算法仍然是流行的十大挖掘演算法之一,該演算法是有監督的學習演算法,解決的是分類問題。該演算法的優點 ...
  • 100個不同類型的python語言趣味編程題 在求解的過程中培養編程興趣,拓展編程思維,提高編程能力。 第一部分:趣味演算法入門;第六題 問題分析: ​ 牛頓迭代法是取x0之後,在這個基礎上,找到比x0更接近的方程的根,一步一步迭代,從而找到更接近方程的近似根。 ​ 設r是f(x)=0的根,選取x0作 ...
  • 依賴註入 不同數據類型的註入方式 除了通過 setter 註入、構造器註入還可以通過類似的 和 進行註入,具體參看官方文檔的例子,使用 "命名空間註入" Bean 作用域 | Scope | Description | | : | : | | "singleton" | (Default) Scop ...
  • Spring 框架 簡介 Spring框架是由於軟體開發的複雜性而創建的 目的:解決企業應用開發的複雜性 功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能 範圍:任何Java應用 優點: 開源的免費的框架(容器) Spring是一個輕量級、非入侵式的框架 控制反轉(IOC)和麵 ...
  • 定義三個方法 1.定義一個獲取數據的getData()方法2.定義一個導出excel表的方法exportSqlServer()3.定義一個獲取類型typeof()的方法,用作查詢出來的數據被識別 下麵直接展示代碼 from datetime import datetime import os imp ...
  • 關於模型: 1:一個模型類對應一個表,模型類中的屬性對應表中的一個欄位 2:欄位類型(資料庫支持的類型) 字元串 1:CharField(Maxlength=長度) models.CharField 2:TextFiled 大文本 3:IntegerField 整數 4:DecimalField(m ...
  • 本文存在[視頻版本][1],請知悉 項目簡介 項目來源於: "https://gitee.com/thuihuang/shine_bookshop" 一個基於 JSP+Servlet+Jdbc 的shine網上書城。涉及技術少,易於理解,適合 JavaWeb初學者 學習使用。 技術棧 編輯器 Ecl ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...