Python打包之setuptools

參考連接1html

參考連接2python

參考連接3git

1、setuptools介紹

Setuptools是Python Distutils的增強版,使開發者構建和發佈Python包更加容易,特別是當包依賴於其餘包時。用setuptools構建和發佈的包與用Distutils發佈的包是相似的。包的使用者無需安裝setuptools就可使用該包。若是用戶是從源碼包開始構建,而且沒有安裝過setuptools的話,則只要在你的setup腳本中包含一個bootstrap模塊(ez_setup),用戶構建時就會自動下載並安裝setuptools了。bootstrap

功能亮點:app

  • 利用EasyInstall自動查找、下載、安裝、升級依賴包
  • 建立Python Eggs
  • 包含包目錄內的數據文件
  • 自動包含包目錄內的全部的包,而不用在setup.py中列舉
  • 自動包含包內和發佈有關的全部相關文件,而不用建立一個MANIFEST.in文件
  • 自動生成通過包裝的腳本或Windows執行文件
  • 支持Pyrex,即在能夠setup.py中列出.pyx文件,而最終用戶無須安裝Pyrex
  • 支持上傳到PyPI
  • 能夠部署開發模式,使項目在sys.path中
  • 用新命令或setup()參數擴展distutils,爲多個項目發佈/重用擴展
  • 在項目setup()中簡單聲明entry points,建立能夠自動發現擴展的應用和框架

 

2、簡單的例子

python中安裝包的方式有不少種:框架

  1. 源碼包:python setup.py install
  2. 在線安裝:pip install 包名 / easy_install 包名

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

 

二、打包上傳到pypi

官網鏈接

2-一、配置文件和打包

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

 

2-二、上傳到Pypi

此時前置打包的步驟已經完成,能夠開始進行上傳。

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

 

 

3、setuptools的進階使用

上面使用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
相關文章
相關標籤/搜索