在上一篇博文中总结了 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="wilber@sh.com",
- 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, 找到所有模块, 生成 stubfiles
3,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= openstack-dev@lists.openstack.org
- 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
具体参数有待深入学习...
来源: https://www.cnblogs.com/goldsunshine/p/8872623.html