分發(fā)Python應(yīng)用程序途徑有哪些

這篇文章主要介紹分發(fā)Python應(yīng)用程序途徑有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

10年積累的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有宕昌免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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)中安裝它及其依

賴項(xiàng)的方式。這些依賴項(xiàng)可以包括其他非Python包以及像二進(jìn)制文件或映像之類的外部資源。

下面是一些幫助你跨平臺(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)程,非常

類似于虛擬化,但不使用虛擬硬件。

它的文件系統(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ǔ)目錄中。

分發(fā)Python應(yīng)用程序途徑有哪些

一旦進(jìn)入容器,你就可以安裝任何需要的Apt或PyPI包。

退出shell后你將會(huì)返回到主機(jī)。此時(shí),你可以運(yùn)行下一條命令將任何的更改保存為一個(gè)新的Docker映像,你可以稍后重用它或?qū)⑵渫扑?/p>

到DockerHub進(jìn)行分發(fā):

分發(fā)Python應(yīng)用程序途徑有哪些

你可以在你組織內(nèi)部的私有Docker 注冊(cè)表中共享此新映像,或者運(yùn)行以下命令將該容器導(dǎo)出為一個(gè)文件,任何人都可以下載它并將其導(dǎo)

入他們的本地Docker環(huán)境中:

分發(fā)Python應(yīng)用程序途徑有哪些

然而,分發(fā)的真正工作流程是創(chuàng)建一個(gè)Dockerfile,任何人都可以使用它來(lái)創(chuàng)建自己的映像。換句話說(shuō),你提供了一個(gè)帶有Docker守護(hù)進(jìn)

程指令的小型文本文件,而不是整個(gè)文件系統(tǒng)的副本。

任何人都可以使用該文件克隆你的repo,并運(yùn)行此命令去創(chuàng)建一個(gè)此映像的本地版本:

分發(fā)Python應(yīng)用程序途徑有哪些

一個(gè)典型的Dockerfile如下所示,請(qǐng)查看他們的文檔以獲取更多信息:

分發(fā)Python應(yīng)用程序途徑有哪些

虛擬機(jī)和Vagrant

容器的下一步是分發(fā)一個(gè)完整的虛擬機(jī)。自從虛擬化得到廣泛應(yīng)用和硬件支持以來(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

之類的東西就是一個(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類似,Hashicorp的Vagrant使用一個(gè)Vagrantfile,其中包含有關(guān)如何啟動(dòng)和配置虛擬機(jī)的指令。

就像Docker映像提供了運(yùn)行容器的基本文件系統(tǒng)一樣,Vagrant box也為虛擬機(jī)提供了基礎(chǔ)文件系統(tǒng)。

下面的示例Vagrantfile與上一節(jié)中的Dockerfile所做的事情類似:

分發(fā)Python應(yīng)用程序途徑有哪些

使用這個(gè)文件克隆你的存儲(chǔ)庫(kù),并運(yùn)行這些命令來(lái)啟動(dòng)VM,然后你就會(huì)進(jìn)入它的shell:

分發(fā)Python應(yīng)用程序途徑有哪些

Vagrant確實(shí)通過(guò)使用Vagrant Box catalog提供與DockerHub類似的體驗(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依賴項(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)行的基本目錄。這意味著,任何依賴__file__來(lái)確定當(dāng)前執(zhí)行路徑的代碼現(xiàn)

在都需要使用PyInstaller配置的內(nèi)部環(huán)境。

分發(fā)你的bundle完全取決于你。對(duì)于這種類型的設(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是這類產(chǎn)品的后起之秀。它是Beeware項(xiàng)目的一部分,該項(xiàng)目旨在將Python應(yīng)用程序打包分發(fā)給所有操作系統(tǒng)和設(shè)備,包括

Android和iOS。

它與PyInstaller處于類似的領(lǐng)域,這意味著它可以將你的模塊及其依賴項(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代碼及其依賴關(guān)庫(kù),那么這個(gè)類別適合你。

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)單:

分發(fā)Python應(yīng)用程序途徑有哪些

然后你可以執(zhí)行該文件來(lái)打開(kāi)一個(gè)帶有你的環(huán)境的REPL:

分發(fā)Python應(yīng)用程序途徑有哪些

你還可以在創(chuàng)建文件時(shí)指定入口點(diǎn),以便它可以在你的模塊中執(zhí)行特定的函數(shù),就像你直接運(yùn)行python命令一樣。

目前沒(méi)有系統(tǒng)可以為你分發(fā)Pex文件,因此,就像前面的項(xiàng)目一樣,你只能使用公共對(duì)象存儲(chǔ)和CDNS。

Shiv

與Pex類似,LinkedIn的人員建立了一個(gè)不同的模塊,稱為Shiv。他們構(gòu)建一些不同的東西的主要原因是試圖在Pex可執(zhí)行文件的開(kāi)始期

間嘗試并解決一個(gè)問(wèn)題。考慮到存儲(chǔ)庫(kù)和依賴項(xiàng)的復(fù)雜性,他們希望以不同的方式處理環(huán)境設(shè)置。

代替將各種輪子與應(yīng)用程序一起打包,Shiv會(huì)包含一個(gè)完整的由pip安裝的site-packages目錄。這讓所有的東西都能開(kāi)箱即用,并且速度

幾乎是Pex的兩倍。

這里是一個(gè)如何使用Shiv生成一個(gè).pyz文件的例子,它做了一些與Pex部分類似的事情:

分發(fā)Python應(yīng)用程序途徑有哪些

然后,你就可以使用以下命令直接執(zhí)行它:

./virtualenv.pyz

需要注意的是,打包帶有OS依賴項(xiàng)的庫(kù)在平臺(tái)之間是不交叉兼容的。正如在Pex部分中提到的,這主要是依賴于底層C庫(kù)的模塊的問(wèn)題。

你必須為每個(gè)平臺(tái)生成不同的文件。

同樣,目前還沒(méi)有讓你分發(fā)這些文件的構(gòu)建系統(tǒng),所以你必須依賴AWS、DO、CDNs或其他應(yīng)用商店,如JFrog的Artifactory或Sonatype的Nexus。

Pipx

雖然不是構(gòu)建應(yīng)用程序或分發(fā)它們的方法,但Pipx提供了一種不同的方式來(lái)安裝它們。它與你的操作系統(tǒng)一起工作,以隔離虛擬環(huán)境及其

依賴項(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ù)。和前面的類別一樣,它們都需要某種形式的對(duì)象或應(yīng)用商店來(lái)幫助分發(fā)。

PyInstaller

雖然我們已經(jīng)討論了PyInstaller,但是在這個(gè)類別中還是值得再次提及它,因?yàn)檫@是它的主要功能之一。

它可以生成整個(gè)應(yīng)用程序的單個(gè)可執(zhí)行文件,并綁定所有依賴項(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í)行類似Pex或Shiv的代碼。這意味著你可以創(chuàng)

建你的包,使它作為一個(gè)REPL運(yùn)行,其中的所有依賴項(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有類似的缺點(diǎn)。你必須將任何內(nèi)部引用調(diào)整為_(kāi)_file__或類似的操作,因此它們依賴于運(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è)概念類似于更廣為人知的Cython,但它不是一種單獨(dú)的語(yǔ)言。它還能做

Cython做不到的事情,比如抓取依賴項(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中也有類似的機(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ù)依賴項(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類似的存儲(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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享標(biāo)題:分發(fā)Python應(yīng)用程序途徑有哪些
分享鏈接:http://bm7419.com/article44/pcoche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站虛擬主機(jī)、網(wǎng)站收錄用戶體驗(yàn)、標(biāo)簽優(yōu)化、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司