中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

一次發(fā)布有多個(gè)發(fā)行版,為什么Python發(fā)行包會(huì)這么難?

2019-05-28    來(lái)源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

雖然經(jīng)常會(huì)使用pip,但你知道它是如何選擇不同的發(fā)行版么?在這篇文章中,作者介紹了Python中的發(fā)行包的一些基本概念,并討論了為什么發(fā)行Python包會(huì)這么難。

大多數(shù)編程語(yǔ)言包的生態(tài)系統(tǒng)都有兩個(gè)層級(jí)(level):每個(gè)包都有一個(gè)或多個(gè)發(fā)布(release),每一次發(fā)布都可以用版本號(hào)(version)進(jìn)行區(qū)分。Python 有第三個(gè)層級(jí):每個(gè)發(fā)布都有一個(gè)或多個(gè)發(fā)行版(distribution),下載安裝包時(shí)下載的實(shí)際文件就是這些發(fā)行版。在大多數(shù)語(yǔ)言中,這些文件都是發(fā)布的同義詞,但是在Python 中「一個(gè)發(fā)布有多個(gè)發(fā)行版」是很重要的,因?yàn)槭褂米顝V泛的那些包,大多數(shù)發(fā)布實(shí)際上都有多個(gè)發(fā)行版。

為什么會(huì)這樣呢?因?yàn)?Python 的特殊之處在于,它將 C 擴(kuò)展(extension)視為該語(yǔ)言的一流特性,并試圖隔離包的使用與編譯 C 擴(kuò)展。這意味著發(fā)行版需要包含編譯 C 擴(kuò)展后的得到的二進(jìn)制代碼,這種發(fā)行版(在其現(xiàn)代迭代中)被稱為 binary wheels。

但是 C 擴(kuò)展通常需要針對(duì)特定的 Python 版本和操作系統(tǒng)進(jìn)行編譯,因此需要使用多個(gè) wheels 來(lái)實(shí)現(xiàn)普適性。此外,由于包的作者不能預(yù)測(cè)出所有的 Python 版本和操作系統(tǒng),所以包含一個(gè)由包用戶負(fù)責(zé)編譯的源發(fā)行版也很重要。

盡管如此,用戶們和大多數(shù)工具考慮的仍然是發(fā)布版本(release),而不是特定的發(fā)行版(distribution)。這可能會(huì)引起極大的不協(xié)調(diào)。例如,在一臺(tái)機(jī)器上安裝一個(gè)包可能需要幾秒鐘(因?yàn)榇嬖谄ヅ涞亩M(jìn)制發(fā)行版),在另一臺(tái)機(jī)器上可能需要幾分鐘甚至幾個(gè)小時(shí)。

即使兩臺(tái)機(jī)器都能找到合適的二進(jìn)制發(fā)行版來(lái)安裝,它們的哈希值也不匹配,檢測(cè) MitM 攻擊也會(huì)因此變得更加困難。因?yàn)?pip 這樣的工具會(huì)自動(dòng)找到在發(fā)布下「最合適」的發(fā)行版,當(dāng)一個(gè)發(fā)行版與給定的系統(tǒng)兼容時(shí)會(huì)偏向于選擇 binary wheel,如果有多個(gè)發(fā)行版與此系統(tǒng)兼容,則選擇最合適的 binary wheel,如果不兼容,則返回到源發(fā)行版。

如果你已經(jīng)安裝了發(fā)布下的一個(gè)發(fā)行版之后,該發(fā)布又有一個(gè)新的發(fā)行版,這時(shí)就會(huì)出現(xiàn)很大的問題。而且這個(gè)問題幾乎是不可避免的——因?yàn)?PyPI 一次只允許上傳一個(gè)發(fā)行版,并會(huì)創(chuàng)建一包含這個(gè)發(fā)行版的新發(fā)布,所以在你上傳最后一個(gè)發(fā)行版之前,一定會(huì)有人已經(jīng)下載了第一個(gè)發(fā)行版。

在使用自動(dòng)編譯程序(buildbot)并行構(gòu)建不同的發(fā)行版之后,這個(gè)問題變得更加常見,二進(jìn)制發(fā)行版一般要比源發(fā)行版花費(fèi)更長(zhǎng)的時(shí)間。當(dāng)一個(gè)包的作者在發(fā)布后的幾個(gè)月或幾年里,再去添加對(duì)新平臺(tái)(或 python 的新版本)的支持時(shí),這種情況就變得更糟糕了。當(dāng)這種情況發(fā)生時(shí),會(huì)有以下一些問題:

構(gòu)建一個(gè)系統(tǒng),期待在給定包中斷時(shí)產(chǎn)生一個(gè)特定的哈希值。

像 PyDist 這樣的 PyPI 鏡像不知道要查找新的發(fā)行版,并且無(wú)法同步。

你的系統(tǒng)(如開發(fā)機(jī)器)如果先前安裝了某發(fā)布的一個(gè)發(fā)行版,這個(gè)系統(tǒng)就不會(huì)獲得。

新的發(fā)行版,并且可能與安裝它的系統(tǒng)(如生產(chǎn)服務(wù)器)的行為不同。

盡管 PyPI 維護(hù)者已經(jīng)意識(shí)到了這些問題并討論了工具改進(jìn),但是在不顯著破壞生態(tài)系統(tǒng)的情況下解決這些問題的方法還是很難找到的。與此同時(shí),Python 重度用戶和系統(tǒng)管理員也有責(zé)任了解 Python 包的分布方式以及 pip 如何選擇發(fā)行版。

標(biāo)簽: [db:TAGG]

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:三年翻倍、估值 8.5 億美金,Tealium 為何能做好數(shù)據(jù)生意?

下一篇:數(shù)據(jù)可視化圖表,你選對(duì)了嗎?