您好,登錄后才能下訂單哦!
這篇文章主要介紹分發(fā)Python應(yīng)用程序途徑有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
2019年P(guān)ython生態(tài)系統(tǒng)中比較流行的主題之一是關(guān)于打包和分發(fā)的。隨著這一年的結(jié)束,我想總結(jié)一下我們目前可用來(lái)分發(fā)用Python構(gòu)
建的應(yīng)用程序的多種途徑。雖然其中一些也適用于任何語(yǔ)言。
無(wú)論你交付的是可執(zhí)行文件、虛擬環(huán)境、打包的代碼還是完整的應(yīng)用程序,下面的列表都包括了標(biāo)準(zhǔn)系統(tǒng)和一些在進(jìn)入2020年時(shí)需要記
住的新事物。
應(yīng)用程序
要發(fā)布一個(gè)應(yīng)用程序,你需要的不僅僅是一個(gè)從PyPI進(jìn)行pip-install的庫(kù)。你需要一種萬(wàn)無(wú)一失的在所有支持的操作系統(tǒng)中安裝它及其依
賴(lài)項(xiàng)的方式。這些依賴(lài)項(xiàng)可以包括其他非Python包以及像二進(jìn)制文件或映像之類(lèi)的外部資源。
下面是一些幫助你跨平臺(tái)安裝和分發(fā)代碼的選項(xiàng)。
Docker
Docker使用操作系統(tǒng)中的基本功能來(lái)隔離進(jìn)程,使其不知道系統(tǒng)的其余部分。它可以在你的主機(jī)內(nèi)運(yùn)行不同操作系統(tǒng)的內(nèi)核進(jìn)程,非常
類(lèi)似于虛擬化,但不使用虛擬硬件。
它的文件系統(tǒng)是分層的,因此占用的空間很小,只包含運(yùn)行所需的文件,而不是典型的虛擬磁盤(pán),虛擬機(jī)中還包括空閑空間。
使用一個(gè)最小程度打包的根文件系統(tǒng),我們會(huì)看到整個(gè)操作系統(tǒng)的映像只占用幾十MB,而不是虛擬機(jī)所需的GB,這并不少見(jiàn)。
你可以在一個(gè)公共注冊(cè)中心(如DockerHub)或你的組織內(nèi)部的一個(gè)私有注冊(cè)中心分發(fā)這些容器。用戶會(huì)在自己的計(jì)算機(jī)上安裝Docker守
護(hù)進(jìn)程,然后使用它來(lái)獲取你的映像并在本地運(yùn)行它。
由于Docker映像只不過(guò)是一個(gè)根文件系統(tǒng),所以你也可以將它們作為一個(gè)文件分發(fā),并使用Docker導(dǎo)入它。
要構(gòu)建一個(gè)映像,你可以從一個(gè)rootfs開(kāi)始,或者在一個(gè)現(xiàn)有的注冊(cè)表映像的基礎(chǔ)上進(jìn)行添加。大多數(shù)操作系統(tǒng)供應(yīng)商在DockerHub中都
維護(hù)了官方的精簡(jiǎn)映像,這些映像通常都很小。
其他組織也為他們的應(yīng)用程序的新版本制作了官方映像,比如構(gòu)建在Debian之上的Python映像。Postgress、MySQL、Redis、Nginx和
許多其他標(biāo)準(zhǔn)服務(wù)也都是這樣做的。
Docker現(xiàn)在可以在Linux、OSX和Windows上運(yùn)行。這種跨平臺(tái)支持意味著你構(gòu)建的任何映像都具有廣泛的分布,并且復(fù)雜性最小。你
不僅可以控制應(yīng)用程序,還可以控制它所運(yùn)行的環(huán)境,從而使兼容性問(wèn)題變得不那么嚴(yán)重。
然而,在配置網(wǎng)絡(luò)或持續(xù)性存儲(chǔ)時(shí)仍然可能存在復(fù)雜性。典型的應(yīng)用程序只需要處理端口轉(zhuǎn)發(fā),但是有時(shí)候我們很難想象抽象層是如何工
作的,所以編寫(xiě)良好的文檔依然很重要。
使用Docker,你可以控制Python發(fā)行版、支持的OS包(如各個(gè)模塊所需的C庫(kù))和你的虛擬環(huán)境。
由于啟動(dòng)一個(gè)容器只需要幾毫秒的時(shí)間,所以每次當(dāng)你想要執(zhí)行應(yīng)用程序時(shí)運(yùn)行一個(gè)新的容器是完全可以接受的,甚至是推薦的。
有些人甚至使用Docker作為虛擬環(huán)境的替代品。由于它啟動(dòng)很快,并且可以提供一個(gè)交互式shell,所以當(dāng)你需要處理一個(gè)特定的項(xiàng)目
時(shí),創(chuàng)建一個(gè)新容器并不是一個(gè)壞主意。
一旦你有了一個(gè)配置了基礎(chǔ)環(huán)境的運(yùn)行容器,你就可以保存該映像以便重用,或者甚至可以將其導(dǎo)出到文件中。
例如,下面的命令會(huì)啟動(dòng)一個(gè)新的Python容器,將當(dāng)前工作目錄掛載為/work,并將你放入一個(gè)bash shell中。容器目錄中的更改反映在
基礎(chǔ)目錄中。
一旦進(jìn)入容器,你就可以安裝任何需要的Apt或PyPI包。
退出shell后你將會(huì)返回到主機(jī)。此時(shí),你可以運(yùn)行下一條命令將任何的更改保存為一個(gè)新的Docker映像,你可以稍后重用它或?qū)⑵渫扑?/p>
到DockerHub進(jìn)行分發(fā):
你可以在你組織內(nèi)部的私有Docker 注冊(cè)表中共享此新映像,或者運(yùn)行以下命令將該容器導(dǎo)出為一個(gè)文件,任何人都可以下載它并將其導(dǎo)
入他們的本地Docker環(huán)境中:
然而,分發(fā)的真正工作流程是創(chuàng)建一個(gè)Dockerfile,任何人都可以使用它來(lái)創(chuàng)建自己的映像。換句話說(shuō),你提供了一個(gè)帶有Docker守護(hù)進(jìn)
程指令的小型文本文件,而不是整個(gè)文件系統(tǒng)的副本。
任何人都可以使用該文件克隆你的repo,并運(yùn)行此命令去創(chuàng)建一個(gè)此映像的本地版本:
一個(gè)典型的Dockerfile如下所示,請(qǐng)查看他們的文檔以獲取更多信息:
虛擬機(jī)和Vagrant
容器的下一步是分發(fā)一個(gè)完整的虛擬機(jī)。自從虛擬化得到廣泛應(yīng)用和硬件支持以來(lái),這種類(lèi)型的系統(tǒng)已經(jīng)存在了一段時(shí)間了。
交付一個(gè)“虛擬設(shè)備”是很有吸引力的,因?yàn)槟銕缀蹩梢酝耆刂颇愕膽?yīng)用程序運(yùn)行的環(huán)境。所有東西都是可配置的:操作系統(tǒng)、它的包、
磁盤(pán)和網(wǎng)絡(luò),甚至空閑空間的大小。
使用虛擬機(jī)的缺點(diǎn)是發(fā)行版的大小,通常是在GB級(jí)。另外,你還得想辦法讓客戶得到你的映像。Amazon S3 或 Digital Ocean Spaces
之類(lèi)的東西就是一個(gè)很好的起點(diǎn)。
一開(kāi)始,只有服務(wù)器硬件支持運(yùn)行虛擬機(jī),但是現(xiàn)在每個(gè)處理器都有這個(gè)能力,而且所有主要的操作系統(tǒng)都支持它。還有一些免費(fèi)的應(yīng)用
程序可以幫助你管理和配置虛擬機(jī),比如Oracle的VirtualBox。
Vagrant是在VirtualBox等管理器上配置和運(yùn)行虛擬機(jī)的另一個(gè)系統(tǒng)。它的功能很像Docker,你可以在一個(gè)文件中指定虛擬機(jī)所需要的所
有東西,它可以為你構(gòu)建和運(yùn)行該虛擬機(jī)。
與前一節(jié)中的Dockerfile類(lèi)似,Hashicorp的Vagrant使用一個(gè)Vagrantfile,其中包含有關(guān)如何啟動(dòng)和配置虛擬機(jī)的指令。
就像Docker映像提供了運(yùn)行容器的基本文件系統(tǒng)一樣,Vagrant box也為虛擬機(jī)提供了基礎(chǔ)文件系統(tǒng)。
下面的示例Vagrantfile與上一節(jié)中的Dockerfile所做的事情類(lèi)似:
使用這個(gè)文件克隆你的存儲(chǔ)庫(kù),并運(yùn)行這些命令來(lái)啟動(dòng)VM,然后你就會(huì)進(jìn)入它的shell:
Vagrant確實(shí)通過(guò)使用Vagrant Box catalog提供與DockerHub類(lèi)似的體驗(yàn)來(lái)幫助我們解決分發(fā)問(wèn)題。
有了它,你可以得到你的基礎(chǔ)映像或上傳新的映像與他人分享。你甚至可以將一個(gè)Vagrantfile指向內(nèi)部的URL去下載一個(gè)box。
PyInstaller
我們之前已經(jīng)介紹過(guò)這個(gè)模塊。PyInstaller負(fù)責(zé)綁定運(yùn)行你的應(yīng)用程序所需的所有資源,包括Python發(fā)行版。在爬取你的代碼時(shí),它會(huì)
指出要打包哪些Python依賴(lài)項(xiàng),同時(shí)仍然允許你指定其它要包括在bundle中的資源。
它的打包結(jié)果是一個(gè)適用于Windows、Linux或OSX的可安裝應(yīng)用程序。在執(zhí)行期間,它會(huì)將該程序與綁定的解釋器一起解壓到一個(gè)文件
夾中,并運(yùn)行你的入口點(diǎn)腳本。
它足夠靈活,可以讓你控制Python發(fā)行版和執(zhí)行環(huán)境。我甚至成功地使用它將瀏覽器與我的Python包綁定在一起。
但使用它確實(shí)會(huì)帶來(lái)麻煩。在提取自身時(shí),它將更改應(yīng)用程序運(yùn)行的基本目錄。這意味著,任何依賴(lài)__file__來(lái)確定當(dāng)前執(zhí)行路徑的代碼現(xiàn)
在都需要使用PyInstaller配置的內(nèi)部環(huán)境。
分發(fā)你的bundle完全取決于你。對(duì)于這種類(lèi)型的設(shè)置,大多數(shù)人選擇對(duì)象存儲(chǔ)和CDN。
在以這種方式分發(fā)時(shí)要記住一點(diǎn),即檢查你的代碼是否需要驗(yàn)證它所運(yùn)行的操作系統(tǒng)環(huán)境。
換句話說(shuō),與使用Docker或Vagrant不同,如果你需要安裝特定的apt包,那你就無(wú)法保證該包在執(zhí)行期間就已經(jīng)存在。
Briefcase
Briefcase是這類(lèi)產(chǎn)品的后起之秀。它是Beeware項(xiàng)目的一部分,該項(xiàng)目旨在將Python應(yīng)用程序打包分發(fā)給所有操作系統(tǒng)和設(shè)備,包括
Android和iOS。
它與PyInstaller處于類(lèi)似的領(lǐng)域,這意味著它可以將你的模塊及其依賴(lài)項(xiàng)綁定到一個(gè)可安裝的應(yīng)用程序中。但它也增加了對(duì)移動(dòng)設(shè)備和帶
有AppleTV或tvOS的電視的支持。
不幸的是,其文檔仍然有點(diǎn)松散,而且主要是以示例的形式。然而,該項(xiàng)目很有前景,并且仍在積極開(kāi)發(fā)中。頗受歡迎的編輯器Mu就將
它用于打包。
你可以將使用Briefcase構(gòu)建的應(yīng)用程序提交到Android和Apple應(yīng)用商店進(jìn)行分發(fā)。
虛擬環(huán)境
有時(shí),我們可以假設(shè)你的用戶擁有一個(gè)標(biāo)準(zhǔn)的操作系統(tǒng)。也許他們都是從公司內(nèi)部的IT部門(mén)構(gòu)建的庫(kù)存映像運(yùn)行的。也許你的應(yīng)用程序很
簡(jiǎn)單,根本不必?fù)?dān)心操作系統(tǒng)或解釋器的復(fù)雜性。
如果你只需要考慮Python代碼及其依賴(lài)關(guān)庫(kù),那么這個(gè)類(lèi)別適合你。
Pex
Pex是由Twitter的員工構(gòu)建的,它是一種將整個(gè)虛擬環(huán)境與你的Python應(yīng)用程序一起發(fā)布的方法。它被設(shè)計(jì)為使用一個(gè)預(yù)先安裝的
Python解釋器,它利用了為Python Zip應(yīng)用程序構(gòu)建的標(biāo)準(zhǔn)(在PEP-441中有概述)。
從Python 2.6開(kāi)始,解釋器就能夠?qū)⒛夸浕騴ip格式的歸檔文件作為腳本執(zhí)行。
Pex構(gòu)建在此基礎(chǔ)之上,簡(jiǎn)化了復(fù)制單個(gè)文件的分發(fā)過(guò)程。這些文件可以在不同的平臺(tái)(OSX、Linux、Windows)以及不同的解釋器上工
作。盡管在使用帶有C綁定的模塊時(shí)存在一些限制。
在你的基本系統(tǒng)中安裝Pex之后,你可以使用它生成一個(gè)包含整個(gè)Python環(huán)境的文件。
將該文件傳遞到你同事的計(jì)算機(jī),你將能夠在那里執(zhí)行該文件,而不需要安裝除基本Python解釋器之外的任何東西。
你甚至可以在解釋器模式下運(yùn)行一個(gè)文件,這樣它就會(huì)打開(kāi)一個(gè)Python REPL,其中包含你的環(huán)境中可以導(dǎo)入的所有必要模塊。
將你的虛擬環(huán)境凍結(jié)為一個(gè).pex文件相當(dāng)簡(jiǎn)單:
然后你可以執(zhí)行該文件來(lái)打開(kāi)一個(gè)帶有你的環(huán)境的REPL:
你還可以在創(chuàng)建文件時(shí)指定入口點(diǎn),以便它可以在你的模塊中執(zhí)行特定的函數(shù),就像你直接運(yùn)行python命令一樣。
目前沒(méi)有系統(tǒng)可以為你分發(fā)Pex文件,因此,就像前面的項(xiàng)目一樣,你只能使用公共對(duì)象存儲(chǔ)和CDNs。
Shiv
與Pex類(lèi)似,LinkedIn的人員建立了一個(gè)不同的模塊,稱(chēng)為Shiv。他們構(gòu)建一些不同的東西的主要原因是試圖在Pex可執(zhí)行文件的開(kāi)始期
間嘗試并解決一個(gè)問(wèn)題??紤]到存儲(chǔ)庫(kù)和依賴(lài)項(xiàng)的復(fù)雜性,他們希望以不同的方式處理環(huán)境設(shè)置。
代替將各種輪子與應(yīng)用程序一起打包,Shiv會(huì)包含一個(gè)完整的由pip安裝的site-packages目錄。這讓所有的東西都能開(kāi)箱即用,并且速度
幾乎是Pex的兩倍。
這里是一個(gè)如何使用Shiv生成一個(gè).pyz文件的例子,它做了一些與Pex部分類(lèi)似的事情:
然后,你就可以使用以下命令直接執(zhí)行它:
./virtualenv.pyz
需要注意的是,打包帶有OS依賴(lài)項(xiàng)的庫(kù)在平臺(tái)之間是不交叉兼容的。正如在Pex部分中提到的,這主要是依賴(lài)于底層C庫(kù)的模塊的問(wèn)題。
你必須為每個(gè)平臺(tái)生成不同的文件。
同樣,目前還沒(méi)有讓你分發(fā)這些文件的構(gòu)建系統(tǒng),所以你必須依賴(lài)AWS、DO、CDNs或其他應(yīng)用商店,如JFrog的Artifactory或Sonatype的Nexus。
Pipx
雖然不是構(gòu)建應(yīng)用程序或分發(fā)它們的方法,但Pipx提供了一種不同的方式來(lái)安裝它們。它與你的操作系統(tǒng)一起工作,以隔離虛擬環(huán)境及其
依賴(lài)項(xiàng),更接近于Homebrew等系統(tǒng)對(duì)OSX的作用。
Pipx提供了一種簡(jiǎn)單的方法,可以讓你將包安裝到隔離的環(huán)境中,并全局地公開(kāi)它們的命令行入口點(diǎn)。它還提供了一種機(jī)制來(lái)列出、升級(jí)
和卸載這些包,而不涉及虛擬環(huán)境的細(xì)節(jié)。
一個(gè)很好的例子就是linter的使用。假設(shè)你在多個(gè)python應(yīng)用程序上工作,每個(gè)應(yīng)用程序都有一個(gè)單獨(dú)的virtualenv,你希望使用flake8
在所有應(yīng)用程序上執(zhí)行相同的linting操作。
代替將flake8模塊安裝到每個(gè)virtualenv中,你可以使用Pipx來(lái)安裝一個(gè)全系統(tǒng)范圍的flake8命令,該命令在每個(gè)環(huán)境中都可用,但運(yùn)行
在它們自己完全獨(dú)立的環(huán)境中。
單文件可執(zhí)行文件
有時(shí),你希望為客戶提供一個(gè)不需要預(yù)裝庫(kù)即可運(yùn)行的可執(zhí)行文件,就像你使用Docker或Pex一樣。
這里描述的機(jī)制可以幫助你完成此任務(wù)。和前面的類(lèi)別一樣,它們都需要某種形式的對(duì)象或應(yīng)用商店來(lái)幫助分發(fā)。
PyInstaller
雖然我們已經(jīng)討論了PyInstaller,但是在這個(gè)類(lèi)別中還是值得再次提及它,因?yàn)檫@是它的主要功能之一。
它可以生成整個(gè)應(yīng)用程序的單個(gè)可執(zhí)行文件,并綁定所有依賴(lài)項(xiàng)。你可以為每個(gè)操作系統(tǒng)創(chuàng)建一個(gè),它就可以像任何其他本機(jī)應(yīng)用程序一
樣運(yùn)行。
PyOxidizer
作為打包和分發(fā)領(lǐng)域的最新產(chǎn)品之一,PyOxidizer非常有前途。它利用了為Rust編程語(yǔ)言創(chuàng)建的打包工具。
與PyInstaller非常相似,你可以完全控制想要綁定到其中的所有內(nèi)容,但它也可以允許你執(zhí)行類(lèi)似Pex或Shiv的代碼。這意味著你可以創(chuàng)
建你的包,使它作為一個(gè)REPL運(yùn)行,其中的所有依賴(lài)項(xiàng)都已預(yù)先安裝。
分發(fā)一個(gè)包括REPL的完整Python環(huán)境會(huì)產(chǎn)生一些令人興奮的應(yīng)用程序,特別是對(duì)于需要多個(gè)包來(lái)進(jìn)行數(shù)據(jù)探索的研究團(tuán)隊(duì)或科學(xué)計(jì)算。
與PyInstaller相比的一個(gè)優(yōu)點(diǎn)是,它不是提取到文件系統(tǒng),而是將自身提取到內(nèi)存中,從而大大縮短了實(shí)際的Python應(yīng)用程序的啟動(dòng)時(shí)
間。
這個(gè)特性與PyInstaller有類(lèi)似的缺點(diǎn)。你必須將任何內(nèi)部引用調(diào)整為_(kāi)_file__或類(lèi)似的操作,因此它們依賴(lài)于運(yùn)行時(shí)PyOxidizer配置的環(huán)
境。
更多的細(xì)節(jié)可以在他們的官方文檔中找到,但我們也在這篇文章中對(duì)此做了很多的介紹。
Nuitka
除了使用一個(gè)綁定的解釋器執(zhí)行Python代碼之外,你還可以選擇將代碼編譯為C。這帶來(lái)了幾個(gè)好處,包括更快執(zhí)行的可能性,因?yàn)镃編
譯器可以執(zhí)行解釋器無(wú)法執(zhí)行的優(yōu)化。
Nuitka是為將Python代碼編譯成C而構(gòu)建的系統(tǒng)。雖然這個(gè)概念類(lèi)似于更廣為人知的Cython,但它不是一種單獨(dú)的語(yǔ)言。它還能做
Cython做不到的事情,比如抓取依賴(lài)項(xiàng)并將所有東西編譯成一個(gè)二進(jìn)制文件。
生成的可執(zhí)行文件能在本地代碼中以更快的速度運(yùn)行,并且不需要提取。
編譯可能會(huì)變得很復(fù)雜,尤其是考慮到平臺(tái)的復(fù)雜性時(shí)。但是如果你為它安排好了時(shí)間,你就能獲得好處。我以前成功地做過(guò)幾次。
應(yīng)用商店體驗(yàn)
我們幾乎每天都在使用的其他應(yīng)用程序分發(fā)系統(tǒng):應(yīng)用商店。此軟件用于安裝和維護(hù)其他應(yīng)用程序。
就像Apple App Store或谷歌Play Store一樣,在Linux中也有類(lèi)似的機(jī)制來(lái)支持簡(jiǎn)單的集成。
Snapcraft
Snapcraft提供標(biāo)準(zhǔn)的應(yīng)用商店體驗(yàn)。你可以將你的應(yīng)用程序發(fā)布到他們的商店,用戶可以在那里發(fā)現(xiàn)并安裝它。
安裝是獨(dú)立的,以避免與其他應(yīng)用程序發(fā)生沖突,并且它可以跨Linux發(fā)行版工作,包括庫(kù)依賴(lài)項(xiàng)。
安裝后,應(yīng)用商店會(huì)自動(dòng)將應(yīng)用程序保持在最新的穩(wěn)定版本,并提供一種機(jī)制來(lái)在保留數(shù)據(jù)同時(shí)恢復(fù)到以前的狀態(tài)。
Ubuntu管理著這個(gè)商店,所以你在打包了你的應(yīng)用程序(或者他們所說(shuō)的snap)之后,你必須用一個(gè)注冊(cè)的Ubuntu One帳號(hào)將這個(gè)snap
發(fā)布到商店。
Flatpak
另一個(gè)與Snapcraft非常相似的概念是Flatpak。
它還通過(guò)使用容器技術(shù)為應(yīng)用程序提供隔離來(lái)提供與FlatHub.org類(lèi)似的存儲(chǔ)體驗(yàn)。不過(guò),您也可以托管自己的私有hub,或者在單個(gè)文
件中分發(fā)包。
Flatpak包還可以利用一些桌面集成功能。它們提供了諸如位置檢測(cè)、訪問(wèn)應(yīng)用程序外部資源的能力(很像您的手機(jī)請(qǐng)求權(quán)限去打開(kāi)文件或
URL)、通知、窗口裝飾等信息。
以上是分發(fā)Python應(yīng)用程序途徑有哪些的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。