參考連接1html
參考連接2python
參考連接3git
Setuptools是Python Distutils的增強版,使開發者構建和發佈Python包更加容易,特別是當包依賴於其餘包時。用setuptools構建和發佈的包與用Distutils發佈的包是相似的。包的使用者無需安裝setuptools就可使用該包。若是用戶是從源碼包開始構建,而且沒有安裝過setuptools的話,則只要在你的setup腳本中包含一個bootstrap模塊(ez_setup),用戶構建時就會自動下載並安裝setuptools了。bootstrap
功能亮點:app
python中安裝包的方式有不少種:框架
pip install的東西從哪裏來的?ide
從PyPI (Python Package Index)來的,官網是: https://pypi.python.org/pypisvg
執行pip install terminaltranslator命令的時候,它就會去從官方網站搜terminaltranslator,搜到了就下載壓縮包並解壓安裝,若是沒有搜索到就會報錯。
函數
源碼包安裝就是你在本地編寫好了一個模塊,本身安裝在本地使用,別人(即便是你本身)都不能 pip install xxx 下載你的模塊工具
1.準備工做
# 1.首先建立咱們須要的目錄結構和文件(自行建立)
# 當前測試的目錄是: /tmp/demo
`-- demo |-- helloapp | |-- hello.py | `-- __init__.py |-- __init__.py |-- myapp | |-- __init__.py | `-- myapp.py `-- setup.py # 2.編輯 setup.py from setuptools import setup, find_packages setup( name="demo", version="1.0", author="zbj", author_email="22@qq.com", packages=find_packages(), ) # 3.編輯 hello.py def hello_func(): print("HelloWorld") # 4.編輯 myapp.py def myapp_func(): print("嘿嘿嘿")
2.源碼安裝
# 進入setup.py所在的那層目錄 cd /tmp/demo # 檢查setup.py 是否有錯誤(warning不是錯誤) python setup.py check # 安裝 python setup.py install
3.結果
打包以後多出兩個文件夾,分別是demo.egg-info和dist。demo.egg-info是必要的安裝信息,
而dist中的壓縮包就是安裝包,此時默認的egg包,egg包就是zip包,若是須要使用egg包,name將egg後綴改爲zip解壓便可
4.測試
測試的時候須要注意導包路徑和當前所在路徑
目前所在路徑是: /tmp/demo
直接進入python解釋器: python3(我本身安裝的python3版本)
5.setuptools更多參數用法
https://setuptools.readthedocs.io/en/latest/setuptools.html
1.建立文件的目錄結構
hello/ |-- hello | |-- hello.py | `-- __init__.py |-- LICENSE |-- README.md `-- setup.py
2. setup.py
from setuptools import setup, find_packages setup( name="hello", version='1.0', description="Test Hello", url="None", author="zbj", author_email="22@qq.com", license="MIT", packages=find_packages() )
3. LICENSE
LICENSE表明許可證
Copyright (c) 2018 The Python Packaging Authority Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4. setuptools 和wheel
首先須要保證你有最新版的setuptools
和wheel
python -m pip install --user --upgrade setuptools wheel
Tip:若是出現問題了能夠查看官網的解決方案:https://packaging.python.org/tutorials/installing-packages/
5. 打包模塊
# 進入到setup.py同級的目錄下 python setup.py sdist bdist_wheel
打包以後多出兩個文件夾,分別是hello.egg-info和dist。hello.egg-info是必要的安裝信息,而dist中的壓縮包就是安裝包
dist中包含兩個文件:
dist/
|-- hello-1.0-py3-none-any.whl `-- hello-1.0.tar.gz
6.打包方式介紹
有了上面的 setup.py 文件,咱們就能夠打出各類安裝包,主要分爲兩類:sdist 和 bdist。
Source distribution
使用 sdist 能夠打包成 source distribution,支持的壓縮格式有:
Format | Description | Notes |
---|---|---|
zip | zip file (.zip) | Windows 默認 |
gztar | gzip’ed tar file (.tar.gz) | Unix 默認 |
bztar | bzip2’ed tar file (.tar.bz2) | |
xztar | xz’ed tar file (.tar.xz) | |
ztar | compressed tar file (.tar.Z) | |
tar | tar file (.tar) |
使用方式爲:
$ python setup.py sdist --formats=gztar,zip
如今目錄下多出 dist 和 *.egg-info 目錄,dist 內保存了咱們打好的包,上面命令使用 --formats
指定了打出 .tar.gz
和 .zip
包,若是不指定則如上表根據具體平臺默認格式打包。
包的名稱爲 setup.py
中定義的 name
, version
以及指定的包格式,格式如:firstApp-0.0.1.tar.gz。
Built distribution
使用 bdist 能夠打出 built distribution,和源碼包相比,因爲預先構建好,因此安裝更快:
Format | Description | Notes |
---|---|---|
gztar | gzipped tar file (.tar.gz) | Unix 默認 |
bztar | bzipped tar file (.tar.bz2) | |
xztar | xzipped tar file (.tar.xz) | |
ztar | compressed tar file (.tar.Z) | |
tar | tar file (.tar) | |
zip | zip file (.zip) | Windows 默認 |
rpm | RPM | |
pkgtool | Solaris pkgtool | |
sdux | HP-UX swinstall | |
wininst | self-extracting ZIP file for Windows | |
msi | Microsoft Installer. |
使用上,和 sdist 同樣,可使用 --formats
指定包格式。如:
$ python setup.py bdist --formats=rpm
同時爲了簡化操做,setuptools 提供了以下命令:
Command | Formats | Notes |
---|---|---|
bdist_dumb | tar, gztar, bztar, xztar, ztar, zip | Windows 默認 zip, Unix 默認 gztar |
bdist_rpm | rpm, srpm | |
bdist_wininst | wininst | |
bdist_msi | msi |
因此上面打 rpm 包可使用:
$ python setup.py bdist_rpm
此時前置打包的步驟已經完成,能夠開始進行上傳。
1.利用twine
將包上傳上去,首先安裝twine
pip install twine
2.註冊 PyPI 帳號
登陸 https://pypi.python.org/pypi,註冊帳號
3.上傳
# 使用 upload $ twine upload dist/* 輸入 username 和 password 即上傳至 PyPI。 # 若是不想每次輸入帳號密碼,能夠在家目錄下建立 .pypirc 文件,內容以下: [distutils] index-servers = pypi pypitest [pypi] username: password: [pypitest] repository: https://test.pypi.org/legacy/ username: password:
4. 檢驗
這時候就能夠,下載包,而後運行裏面方法了
pip install hello
在本地測試的時候能夠直接安裝打包好的dist下的包: pip install xxx.tag.gz 測試功能正常後再上傳到pypi
5. 更新版本
更新版本也很簡單,只須要修改setup.py下的version
而後從新生成檔案,上傳
python setup.py sdist bdist_wheel twine upload dist/hello-0.0.2*
6.更新本地moudle版本
pip install --upgrade hello 或者是先卸載,再安裝 # 卸載hello pip uninstall hello # 安裝hello pip install hello
上面使用setuptools時只是簡單的用一個配置文件setup.py就完成了打包信息填寫。在真實的開發環境中,每每是多個文件配合。以openstack的打包爲例。openstack中引入了Pbr的管理工具。
pbr是setuptools的輔助工具,最初爲openstack開發,基於d2to1。Pbr會讀取和過濾setup.cfg中的內容,而後將解析後的數據提供給setup.py做爲參數。 setup.cfg提供setup.py的默認參數,同時易於修改。Setup.py先解析setup.cfg文件,而後執行相關命令。包括如下功能: 1、從git中獲取Version,AUTHORS和ChangeLog信息 2、SphinxAutodoc。pbr會掃描project,找到全部模塊,生成stubfiles 3、Requirements。讀取requirements.txt文件,生成setup函數須要依賴包 四、long_description。從README.rst、README.txt或者READMEfile中生成long_description參數
Pbr的文件很簡單,以下。配置以後會自動尋找目錄下的setup.cfg文件,解析文件參數給setup.py使用。
https://docs.openstack.org/pbr/latest/user/using.html
setup.py
from setuptools import setup setuptools.setup( setup_requires=['pbr'], pbr=True)
setup.cfg
[metadata] name = my_package version = attr: src.VERSION description = My package description long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst keywords = one, two license = BSD 3-Clause License classifiers = Framework :: Django License :: OSI Approved :: BSD License Programming Language :: Python :: 3 Programming Language :: Python :: 3.5 [files] packages = project_name data_files = etc/pbr = etc/pbr/* [global] setup-hooks = pbr.hooks.setup_hook [entry_points] console_scripts = project_name = project.cmd.mycmd:main [options] zip_safe = False include_package_data = True packages = find: scripts = bin/first.py bin/second.py install_requires = requests importlib; python_version == "2.7" [options.package_data] * = *.txt, *.rst hello = *.msg [options.extras_require] pdf = ReportLab>=1.2; RXP rest = docutils>=0.3; pack ==1.1, ==1.3 [options.packages.find] exclude = src.subpackage1 src.subpackage2 [options.data_files] /etc/my_package = site.d/00_default.conf host.d/00_default.conf data = data/img/logo.png, data/svg/icon.svg