天天看點

python打包工具下載下傳_python打包工具distutils、setuptools分析

在上一篇博文中總結了python中導入包,安裝包一條完整的線路。其中有一個有意思的知識點,安裝包的方式有很多種,子產品和包管理中打包,釋出,安裝也是值得研究的内容。

python中安裝包的方式有很多種:

源碼包:python setup.py install

線上安裝:pip install 包名(linux) / easy_install 包名(window)

python包在開發中十分常見,一般的使用套路是所有的功能做一個python子產品包,打包子產品,然後釋出,安裝使用。打包和安裝包就是最常見的工作。學習中遇到distutils和setuptools兩種打包的工具,學習之後做筆記記錄。

distutils

distutils 是 python 标準庫的一部分,這個庫的目的是為開發者提供一種友善的打包方式, 同時為使用者提供友善的安裝方式。當我們開發了自己的子產品之後,使用distutils的setup.py打包。

一、完成功能python

python打包工具下載下傳_python打包工具distutils、setuptools分析

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

python打包工具下載下傳_python打包工具distutils、setuptools分析

再次檢視目前目錄下自動生成了一個檔案夾dist,檔案夾中有一個壓縮包即為我們的目标檔案。另外有一個記錄檔案MANIFEST。

python打包工具下載下傳_python打包工具distutils、setuptools分析

四、安裝子產品

hello_module-1.0.tar.gz 是生成的python子產品。切換到的我的python虛拟環境中,安裝該子產品。

python打包工具下載下傳_python打包工具distutils、setuptools分析
python打包工具下載下傳_python打包工具distutils、setuptools分析

使用python setup.py install 安裝該子產品。從路徑可以看出,該子產品安裝到标準庫的制定路徑下。

python打包工具下載下傳_python打包工具distutils、setuptools分析

五、使用子產品

安裝好子產品之後,在python的互動環境中導入子產品。子產品就是hello.py檔案,引用hello.py檔案中的hello_fun()函數。

python打包工具下載下傳_python打包工具distutils、setuptools分析

setuptools

setuptools是distutils的增強版。setuptools有一個entry_points功能很友善,類似linux啟動某個服務,如在linux指令行裡firefox能啟動火狐浏覽器。

首先檢驗沒有安裝之前,指令path沒有作用。

python打包工具下載下傳_python打包工具distutils、setuptools分析

一、建立功能包

建立一個檔案夾demo,在檔案夾裡建立get_path.py和__init__.py兩個檔案。get_path.py是功能函數,__init__.py是包的辨別檔案。

python打包工具下載下傳_python打包工具distutils、setuptools分析

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

python打包工具下載下傳_python打包工具distutils、setuptools分析

打包之後多出兩個檔案夾,分别是demo.egg-info和dist。demo.egg-info是必要的安裝資訊,而dist中的壓縮包就是安裝包。

python打包工具下載下傳_python打包工具distutils、setuptools分析

檢視dist/demo-0.1.tar.gz解壓之後的檔案。

python打包工具下載下傳_python打包工具distutils、setuptools分析

四、安裝包

python打包工具下載下傳_python打包工具distutils、setuptools分析

五、使用包

安裝之後在指令行中直接輸入path,回車能夠看到調用了get_path.py中的函數fun(),輸出字元串。

python打包工具下載下傳_python打包工具distutils、setuptools分析

同時也可以導入使用。

python打包工具下載下傳_python打包工具distutils、setuptools分析

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

具體參數有待深入學習。。。