在之前學習stevedore時,在setup.py中使用setuptools打包發布了代碼,然后調用代碼中的實例化對象。參考我的文章 https://www.cnblogs.com/CaesarLinsa/p/8571297.html
今天使用更方便的方式,使用pbr。pbr是一個管理python setuptools 的工具庫,pbr模塊讀入setup.cfg文件的信息,並且給setuptools 中的setup hook 函數填寫默認參數,提供更加有意義的行為。
pbr只需要最小化的setup.py 文件,描述包的內容:
import setuptools setuptools.setup(setup_requires=['pbr'], pbr=True)
[metadata] #包信息 name = caesarlinsa # 包名 version = 1.0 # 版本 description-file = README.md #描述文件 author = caesar #作者 author-email = author@example.com # 作者郵箱 classifier = Intended Audience :: Developers # 功用,平台等 Programming Language :: Python :: 2.7 # python 版本 [files] packages = caesar #包名 遞歸Python包層次結構並安裝,如果未指定packages,則默認為[metadata]部分中給出的name字段的值。注意會根據__init__.py進行遞歸掃描
extra_files =
requirements.txt # 描述包依賴的pip源文件
[entry_points] # 模塊入口 caesar.metering.storage = mongodb = caesar.storage.impl_mongodb:Connection
console_scripts = # 可執行腳本,在linux上/usr/local/bin,在windows上在python的Scripts中生成。
caesar-api = Test.cmd.api:main
其中最感興趣的是[entry_points],因為可以通過注冊功能模塊的方式,在一個包中引入不同的模塊,並使其相互調用。如果不使用這種方式,使用sys.path.append()引入自定義模塊,將非常復雜,並且很不pythonic。
在linux環境上發布包並進行安裝,會默認部署在/usr/lib/python2.7/dist-packages/caesar目錄下,調用執行都OK。
可以使用以下三種方式打包:
1 tar.gz格式:這個就是標准壓縮格式,里面包含了項目元數據和代碼,使用python setup.py sdist命令生成。
2 .egg格式:本質上一個壓縮文件,擴展名換了,里面也包含了項目元數據以及源代碼。可以通過命令python setup.py bdist_egg命令生成。
3 .whl格式:這個是Wheel包,也是一個壓縮文件,只是擴展名換了,里面也包含了項目元數據和代碼。可以通過命令python setup.py bdist_wheel生成.
在windows環境上,安裝包后就可以調用[entry_points]中的模塊,而不出現異常報錯。
Eroor:
1.當出現以下錯誤,請使用git init初始化倉庫
2.在包中注意setup.py和setup.conf放入最外面,比如包Test,需要和包在同一個級,否則打包中會不存在源代碼,調用失敗。正確做法如下:
安裝見下圖,egg文件與源文件復制到dist-packages下
以上只是個人感悟,具體可參考我的github: https://github.com/CaesarLinsa/ceilometer_TestCase