在上一篇博文中總結了python中導入包,安裝包一條完整的線路。其中有一個有意思的知識點,安裝包的方式有很多種,子產品和包管理中打包,釋出,安裝也是值得研究的内容。
python中安裝包的方式有很多種:
源碼包:python setup.py install
線上安裝:pip install 包名(linux) / easy_install 包名(window)
python包在開發中十分常見,一般的使用套路是所有的功能做一個python子產品包,打包子產品,然後釋出,安裝使用。打包和安裝包就是最常見的工作。學習中遇到distutils和setuptools兩種打包的工具,學習之後做筆記記錄。
distutils
distutils 是 python 标準庫的一部分,這個庫的目的是為開發者提供一種友善的打包方式, 同時為使用者提供友善的安裝方式。當我們開發了自己的子產品之後,使用distutils的setup.py打包。
一、完成功能python
hello.py
def hello_fun():
print "i say hello to you"
二、建立setup.py檔案
setup.py
from distutils.core import setup
setup(
name="hello_module",
version="1.0",
author="ljk",
author_email="[email protected]",
py_modules=['hello'],
)
三、執行打包指令
python setup sdist
再次檢視目前目錄下自動生成了一個檔案夾dist,檔案夾中有一個壓縮包即為我們的目标檔案。另外有一個記錄檔案MANIFEST。
四、安裝子產品
hello_module-1.0.tar.gz 是生成的python子產品。切換到的我的python虛拟環境中,安裝該子產品。
使用python setup.py install 安裝該子產品。從路徑可以看出,該子產品安裝到标準庫的制定路徑下。
五、使用子產品
安裝好子產品之後,在python的互動環境中導入子產品。子產品就是hello.py檔案,引用hello.py檔案中的hello_fun()函數。
setuptools
setuptools是distutils的增強版。setuptools有一個entry_points功能很友善,類似linux啟動某個服務,如在linux指令行裡firefox能啟動火狐浏覽器。
首先檢驗沒有安裝之前,指令path沒有作用。
一、建立功能包
建立一個檔案夾demo,在檔案夾裡建立get_path.py和__init__.py兩個檔案。get_path.py是功能函數,__init__.py是包的辨別檔案。
get_path.py
import os
def fun():
print "i am in the path:"
print os.getcwd()
二、配置setup.py檔案
建立setup.py檔案,填寫必要的打包資訊。
setup.py
#-*- encoding: UTF-8 -*-
from setuptools import setup
setup(
name = "demo", # 包名
version = "0.1", # 版本資訊
packages = ['demo'], # 要打包的項目檔案夾
include_package_data=True, # 自動打封包件夾内所有資料
zip_safe=True, # 設定項目包為安全,不用每次都檢測其安全性
install_requires = [ # 安裝依賴的其他包(測試資料)
'docutils>=0.3',
'requests',
],
# 設定程式的入口為path
# 安裝後,指令行執行path相當于調用get_path.py中的fun方法
entry_points={
'console_scripts':[
'path = demo.get_path:fun'
]
},
)
在配置中将該子產品需要的依賴全部都寫好,安裝時指定位址去下載下傳。這種方式簡化了使用時的安裝過程,但是還不夠好。最好的方式是pip的自動下載下傳。
三、打包
python setup.py sdist
打包之後多出兩個檔案夾,分别是demo.egg-info和dist。demo.egg-info是必要的安裝資訊,而dist中的壓縮包就是安裝包。
檢視dist/demo-0.1.tar.gz解壓之後的檔案。
四、安裝包
五、使用包
安裝之後在指令行中直接輸入path,回車能夠看到調用了get_path.py中的函數fun(),輸出字元串。
同時也可以導入使用。
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,找到所有子產品,生成stubfiles3、Requirements。讀取requirements.txt檔案,生成setup函數需要依賴包4、long_description。從README.rst、README.txt或者READMEfile中生成long_description參數
Pbr的檔案很簡單,如下。配置之後會自動尋找目錄下的setup.cfg檔案,解析檔案參數給setup.py使用。
setup.py
from setuptools import setup
setuptools.setup(
setup_requires=['pbr'],
pbr=True)
setup.cfg
[metadata]
name= keystone
version= 2015.2
summary= OpenStack Identity
description-file=
README.rst
author= OpenStack
author-email= [email protected]
home-page= http://www.openstack.org/
classifier=
Environment:: OpenStack
IntendedAudience :: Information Technology
IntendedAudience :: System Administrators
License:: OSI Approved :: Apache Software License
OperatingSystem :: POSIX :: Linux
ProgrammingLanguage :: Python
ProgrammingLanguage :: Python :: 2
ProgrammingLanguage :: Python :: 2.7
[files]
packages=
keystone
[global]
setup-hooks=
pbr.hooks.setup_hook
[egg_info]
tag_build=
tag_date= 0
tag_svn_revision= 0
[build_sphinx]
all_files= 1
build-dir= doc/build
source-dir= doc/source
[compile_catalog]
directory= keystone/locale
domain= keystone
具體參數有待深入學習。。。