最近我正在執(zhí)行目前專案中的一項(xiàng)非常具體的任務(wù)
為 Red Hat 工作,RHEL Lightspeed
ShellAI,這個(gè)專案是
相對較新,但我們希望開始為我們的量化寬鬆開發(fā) RPM
朋友們開始使用該工具並在他們的管道中測試它。
我知道包裝和一般Python東西的方法,但是夥計(jì),我必須
告訴你,這個(gè)包裝任務(wù)花了我整整兩天的時(shí)間才完成。讓我
指導(dǎo)您快速完成任務(wù)的詳細(xì)資訊。
TLDR;最終一切順利,這就是最終的 PR:
https://github.com/rhel-lightspeed/shellai/pull/4
任務(wù)詳情
ShellAI 專案計(jì)劃在 RHEL 9 和即將推出的版本下發(fā)布
RHEL 10。作為獎(jiǎng)勵(lì)目標(biāo),我們希望它也能在 RHEL 8 上運(yùn)行。
根據(jù)上面的陳述,如果您之前已經(jīng)使用過 RHEL,那麼您已經(jīng)
猜測挑戰(zhàn)將是依賴項(xiàng)的版本
在 RHEL 中。
- RHEL 8 有 Python 3.6
- RHEL 9 有 Python 3.9
- 最後,RHEL 10 有 Python 3.12
我們也希望相對頻繁地進(jìn)行開發(fā)構(gòu)建,以便
在我們開發(fā)工具時(shí)測試新功能。
對於開發(fā)部分,我們想使用
pdm 來管理我們的依賴關(guān)係和
構(gòu)建。當(dāng)我們完成任務(wù)時(shí),我們注意到 pdm 後端不是
已在 RHEL 儲存庫中提供,因此我們使用預(yù)設(shè)的 setuptools build
後端。
由於我們的系統(tǒng)目標(biāo)“相對較新”,我們希望對
進(jìn)行現(xiàn)代化改造
項(xiàng)目並確保我們使用新的工具/結(jié)構(gòu)和格式。對於
我們選擇使用 pyproject.toml 來做,因?yàn)樗峭高^ pdm init 產(chǎn)生的
當(dāng)我們引導(dǎo)專案時(shí)。
建置 RPM 時(shí)遇到的問題
最初,我們的想法是使用最新的 python 功能和項(xiàng)目
結(jié)構(gòu),例如 pyproject.toml 檔案而不是舊的 setup.py。
當(dāng)你開始一個(gè)新專案時(shí),一切都很酷而且很新,你會(huì)感到非常興奮
要使用那些東西,唯一的問題是:
- 它們非常適合開發(fā)過程,但不適合打包。
最初,當(dāng)我開始任務(wù)時(shí),我認(rèn)為我們可以使用新的 RPM
用於建立專案的宏,因?yàn)槲覀兪褂?pyproject.toml 和 pdm
管理依賴關(guān)係。
為此,F(xiàn)edora 文件有一篇不錯(cuò)的文章,名為 Python Packaging
指南
他們?nèi)ツ难e的詳細(xì)資料。雖然指南涵蓋了幾乎所有主題和案例
你可能需要,即使有一個(gè)例子
規(guī)格文件。
我們的主要目標(biāo)是 RHEL,我們可以想像遵循一切
從指南中可以按原樣工作,對嗎?不,原因在於
RHEL 儲存庫中提供的版本。即使新的宏
指南中指出的可能在建造過程中起作用,您將無法產(chǎn)生
以下目標(biāo)的最終 RPM:
- RHEL 8 將在 %generate_buildrequires 期間向您拋出錯(cuò)誤,如下所示 該版本中附帶的 python3-setuptools 版本非常舊且確實(shí) 不太認(rèn)識新的 pyproject.toml 格式。
- RHEL 9 將能夠完成大部分步驟,但會(huì)失敗 %pyproject_wheel,因?yàn)樗鼘⒔⒁粋€(gè)名為 UNKNOWN 的套件。這 發(fā)生這種情況是因?yàn)椋ㄔ俅危㏑HEL 9 下提供的 python3-setuptools 是 老的。它無法識別由 pyproject.toml 規(guī)範(fàn)
解決方案
我們必須創(chuàng)造遺產(chǎn)
setup.py
文件以便繼續(xù)進(jìn)行 Python 輪構(gòu)建,並避免數(shù)據(jù)
pyproject.toml 和我們的舊版 setup.py 檔案之間存在重複,我們
使用 tomllib,因?yàn)?br>
原因如下:
- tomllib 在 RHEL 8 中可用(透過 pypi 和 rpm 打包)
- Python 3.11 之後,tomllib 原生捆綁到標(biāo)準(zhǔn)庫中
如您在上面看到的,我們使用 tomllib 來載入 pyproject.toml 檔案並且
閱讀必要的欄位並簡單地更新我們的舊版 setup.py。這樣我們
能夠修改 pyproject.toml ,每當(dāng)我們推送新版本時(shí),我們都會(huì)
也能夠在我們的舊版 setup.py 中保持一致性。
關(guān)於規(guī)範(fàn)文件,我們必須回傳並使用文件中所說的
「201x時(shí)代」Python打包
指南。
本質(zhì)上,我們使用的是舊的 python setup.py build ... 指令
(顯然是透過宏)來建構(gòu)專案。
該解決方案使我們能夠在我們想要的 RHEL 版本之間保持一致性
支持,同時(shí)繼續(xù)使用 pdm 和閃亮的新功能
我們希望得到發(fā)展。
以上是打包 python RPM的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

多態(tài)是Python面向?qū)ο缶幊讨械暮诵母拍?,指“一種接口,多種實(shí)現(xiàn)”,允許統(tǒng)一處理不同類型的對象。 1.多態(tài)通過方法重寫實(shí)現(xiàn),子類可重新定義父類方法,如Animal類的speak()方法在Dog和Cat子類中有不同實(shí)現(xiàn)。 2.多態(tài)的實(shí)際用途包括簡化代碼結(jié)構(gòu)、增強(qiáng)可擴(kuò)展性,例如圖形繪製程序中統(tǒng)一調(diào)用draw()方法,或遊戲開發(fā)中處理不同角色的共同行為。 3.Python實(shí)現(xiàn)多態(tài)需滿足:父類定義方法,子類重寫該方法,但不要求繼承同一父類,只要對象實(shí)現(xiàn)相同方法即可,這稱為“鴨子類型”。 4.注意事項(xiàng)包括保持方

參數(shù)(parameters)是定義函數(shù)時(shí)的佔(zhàn)位符,而傳參(arguments)是調(diào)用時(shí)傳入的具體值。 1.位置參數(shù)需按順序傳遞,順序錯(cuò)誤會(huì)導(dǎo)致結(jié)果錯(cuò)誤;2.關(guān)鍵字參數(shù)通過參數(shù)名指定,可改變順序且提高可讀性;3.默認(rèn)參數(shù)值在定義時(shí)賦值,避免重複代碼,但應(yīng)避免使用可變對像作為默認(rèn)值;4.args和*kwargs可處理不定數(shù)量的參數(shù),適用於通用接口或裝飾器,但應(yīng)謹(jǐn)慎使用以保持可讀性。

迭代器是實(shí)現(xiàn)__iter__()和__next__()方法的對象,生成器是簡化版的迭代器,通過yield關(guān)鍵字自動(dòng)實(shí)現(xiàn)這些方法。 1.迭代器每次調(diào)用next()返回一個(gè)元素,無更多元素時(shí)拋出StopIteration異常。 2.生成器通過函數(shù)定義,使用yield按需生成數(shù)據(jù),節(jié)省內(nèi)存且支持無限序列。 3.處理已有集合時(shí)用迭代器,動(dòng)態(tài)生成大數(shù)據(jù)或需惰性求值時(shí)用生成器,如讀取大文件時(shí)逐行加載。注意:列表等可迭代對像不是迭代器,迭代器到盡頭後需重新創(chuàng)建,生成器只能遍歷一次。

類方法是Python中通過@classmethod裝飾器定義的方法,其第一個(gè)參數(shù)為類本身(cls),用於訪問或修改類狀態(tài)。它可通過類或?qū)嵗{(diào)用,影響的是整個(gè)類而非特定實(shí)例;例如在Person類中,show_count()方法統(tǒng)計(jì)創(chuàng)建的對像數(shù)量;定義類方法時(shí)需使用@classmethod裝飾器並將首參命名為cls,如change_var(new_value)方法可修改類變量;類方法與實(shí)例方法(self參數(shù))、靜態(tài)方法(無自動(dòng)參數(shù))不同,適用於工廠方法、替代構(gòu)造函數(shù)及管理類變量等場景;常見用途包括從

處理API認(rèn)證的關(guān)鍵在於理解並正確使用認(rèn)證方式。 1.APIKey是最簡單的認(rèn)證方式,通常放在請求頭或URL參數(shù)中;2.BasicAuth使用用戶名和密碼進(jìn)行Base64編碼傳輸,適合內(nèi)部系統(tǒng);3.OAuth2需先通過client_id和client_secret獲取Token,再在請求頭中帶上BearerToken;4.為應(yīng)對Token過期,可封裝Token管理類自動(dòng)刷新Token;總之,根據(jù)文檔選擇合適方式,並安全存儲密鑰信息是關(guān)鍵。

Python的magicmethods(或稱dunder方法)是用於定義對象行為的特殊方法,它們以雙下劃線開頭和結(jié)尾。 1.它們使對象能夠響應(yīng)內(nèi)置操作,如加法、比較、字符串表示等;2.常見用例包括對像初始化與表示(__init__、__repr__、__str__)、算術(shù)運(yùn)算(__add__、__sub__、__mul__)及比較運(yùn)算(__eq__、__lt__);3.使用時(shí)應(yīng)確保其行為符合預(yù)期,例如__repr__應(yīng)返回可重構(gòu)對象的表達(dá)式,算術(shù)方法應(yīng)返回新實(shí)例;4.應(yīng)避免過度使用或以令人困惑的方

Pythonmanagesmemoryautomaticallyusingreferencecountingandagarbagecollector.Referencecountingtrackshowmanyvariablesrefertoanobject,andwhenthecountreacheszero,thememoryisfreed.However,itcannothandlecircularreferences,wheretwoobjectsrefertoeachotherbuta

@property是Python中用於將方法偽裝成屬性的裝飾器,允許在訪問屬性時(shí)執(zhí)行邏輯判斷或動(dòng)態(tài)計(jì)算值。 1.它通過@property裝飾器定義getter方法,使外部像訪問屬性一樣調(diào)用方法;2.搭配.setter可控制賦值行為,如校驗(yàn)值合法性,不定義.setter則為只讀屬性;3.適用於屬性賦值校驗(yàn)、動(dòng)態(tài)生成屬性值、隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié)等場景;4.使用時(shí)注意屬性名與私有變量名不同名,避免死循環(huán),適合輕量級操作;5.示例中Circle類限制radius非負(fù),Person類動(dòng)態(tài)生成full_name屬
