W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
distribute 的前身是 setuptools ,是一個(gè)通常用于分發(fā) Python 庫和擴(kuò)展程序的外部庫。它依賴于隨 Python 預(yù)裝的 distutils 庫, 而后者則是一個(gè)基礎(chǔ)的模塊安裝系統(tǒng),這一安裝系統(tǒng)也支持很多復(fù)雜的構(gòu)造,使得 大型應(yīng)用更易于分發(fā)。
而對于 Flask 自己,則所有您可以在 cheessshop 上找到的軟件包,都隨著 distribute 分發(fā)管理器,或者更古老的 setuptools 和 distutils 分發(fā)。
在這里,我們假定您的應(yīng)用名為 yourapplication.py ,而您沒使用模塊而是使用 package 的結(jié)構(gòu)來組織代碼。分發(fā)帶有標(biāo)準(zhǔn)模塊的 代碼不被 distribute 支持,所以我們不去管它。如果您還沒有將您的應(yīng)用轉(zhuǎn)化為包的形式, 請參考前文 大型應(yīng)用 的內(nèi)容查找如何做到這件事。
利用 distribute 完成一個(gè)有效的部署進(jìn)行更復(fù)雜和更自動(dòng)化的部署方案的第一步, 如果您使程序完全自動(dòng)化,可以閱讀 使用 Fabric 部署 這一章。
因?yàn)槟阋呀?jīng)讓 Flask 運(yùn)行起來了,所以不管怎么說您的系統(tǒng)上應(yīng)該會(huì)有 setuptools 或者d istribute,如果你沒有這兩樣,不要害怕。這里幫你準(zhǔn)備了一個(gè)腳本: distribute_setup.py 你只需要下載并用 Python 解釋器運(yùn)行它。
考慮這些操作可能會(huì)有風(fēng)險(xiǎn),因此建議您參考 你最好使用 virtualenv 一文。
您的安裝代碼將總是保存在與您應(yīng)用同目錄下的 setup.py 文件中。為文件 指定這一名稱只是為了方便,不過一般來說每一個(gè)人自然而然的在程序目錄下 尋找這個(gè)文件,所以您最好別改變它。
同時(shí),即使您在使用 distribute ,您也會(huì)導(dǎo)入一個(gè)名為 setuptools 的包。 distribute 完全向下兼容 setuptools ,所以我們也使用這個(gè)名字來導(dǎo)入它。
一個(gè)基本的 Flask 應(yīng)用的 setup.py 文件看起來像如下這樣:
from setuptools import setup
setup(
name='Your Application',
version='1.0',
long_description=__doc__,
packages=['yourapplication'],
include_package_data=True,
zip_safe=False,
install_requires=['Flask']
)
切記,您必須詳細(xì)地列出子代碼包,如果您想要 distribute 自動(dòng)為您尋找這些包, 您可以使用 find_packages 函數(shù):
from setuptools import setup, find_packages
setup(
...
packages=find_packages()
)
大多數(shù) setup 函數(shù)當(dāng)中的參數(shù)的意義從字面意思就能看出來,然而 include_package_data 和 zip_safe 可能不在此列。 include_package_data 告訴 distribute 自動(dòng)查找一個(gè) MANIFEST.in 文件。 解析此文件獲得有效的包類型的數(shù)據(jù),并安裝所有這些包。我們使用這個(gè)特性來分發(fā) Python 模塊自帶的靜態(tài)文件和模板(參考 分發(fā)代碼)。而 zip_safe 標(biāo)志可以被用來強(qiáng)制阻止 ZIP 安裝包的建立。通常情況下,您不希望您的包以 ZIP 壓縮 包的形式被安裝,因?yàn)橐恍┕ぞ卟恢С诌@種方式,而且這樣也會(huì)讓調(diào)試代碼異常麻煩。
如果您視圖安裝您剛剛創(chuàng)建的包,您會(huì)發(fā)現(xiàn)諸如 static 和 templates 這樣的 文件夾沒有安裝進(jìn)去。這是因?yàn)?distribute 不知道該把哪些文件添加進(jìn)去。您只要 在 setup.py 相同的文件夾下創(chuàng)建一個(gè) MANIFEST.in 文件,并在此文件中列出 所有應(yīng)該被添加進(jìn)去的文件:
recursive-include yourapplication/templates *
recursive-include yourapplication/static *
不要忘記,即使您已經(jīng)將他們列在 MANIFEST.in 文件當(dāng)中,也需要您將 setup 函數(shù)的 include_package_data 參數(shù)設(shè)置為 True ,否則他們?nèi)匀徊粫?huì)被安裝。
您需要使用一個(gè)鏈表在 install_requires 參數(shù)中聲明依賴關(guān)系。鏈表的每個(gè)元素是 需要從 PyPI 下載并安裝的包的名字,默認(rèn)將總會(huì)下載安裝最新的的版本。但是您也 可以指定需要的最大和最小的版本區(qū)間。以下是一個(gè)例子:
install_requires=[
'Flask>=0.2',
'SQLAlchemy>=0.6',
'BrokenPackage>=0.7,<=1.0'
]
前文曾經(jīng)指出,這些依賴都從 PyPI 當(dāng)中下載,如果您需要依賴一個(gè)不能在 PyPI 當(dāng)中 被下載的包,比如這個(gè)包是個(gè)內(nèi)部的,您不想與別人分享。這時(shí),您可以依然照原來 那樣將包列在列表里,但是同時(shí)提供一個(gè)包括所有可選下載地址的列表,以便于安裝時(shí) 從這些地點(diǎn)尋找分發(fā)的軟件包:
dependency_links=['http://example.com/yourfiles']
請確認(rèn)那個(gè)頁面包含一個(gè)文件夾列表,且頁面上的連接被指向?qū)嶋H需要下載的軟件包。 distribute 通過掃描這個(gè)頁面來尋找需要安裝的文件,因此文件的名字必須是正確無誤的。 如您有一個(gè)內(nèi)部服務(wù)器包含有這些包,將 URL 指向這個(gè)服務(wù)器。
安裝您的應(yīng)用(到一個(gè) virtualenv),只需使用 install 指令運(yùn)行 setup.py 即可。 這會(huì)將您的應(yīng)用安裝到一個(gè) virtualenv 的 site-packages 文件夾下面,并且同時(shí) 下載和安裝所有的依賴包:
$ python setup.py install
如果您在進(jìn)行基于這個(gè)包的開發(fā),并且希望安裝開發(fā)所依賴的工具或軟件包, 您可以使用 develop 命令代替 install
$ python setup.py develop
此時(shí)將不會(huì)把您的文件拷貝到 site-packages 文件夾,而僅僅是在那里創(chuàng)建指向 這些文件的文件鏈接。您可以繼續(xù)編輯和修改這些代碼,而無需在每次修改之后 運(yùn)行 install 命令。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: