浅析python打包工具distutils、setuptools


Posted in Python onApril 20, 2018

python中安装包的方式有很多种:

  1. 源码包:python setup.py install
  2. 在线安装:pip install 包名(linux) / easy_install 包名(window)

python包在开发中十分常见,一般的使用套路是所有的功能做一个python模块包,打包模块,然后发布,安装使用。打包和安装包就是最常见的工作。学习中遇到distutils和setuptools两种打包的工具,学习之后做笔记记录。

distutils

distutils 是 python 标准库的一部分,这个库的目的是为开发者提供一种方便的打包方式, 同时为使用者提供方便的安装方式。当我们开发了自己的模块之后,使用distutils的setup.py打包。

一、完成功能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="wilber@sh.com",
 py_modules=['hello'],
)

三、执行打包命令

浅析python打包工具distutils、setuptools

再次查看当前目录下自动生成了一个文件夹dist,文件夹中有一个压缩包即为我们的目标文件。另外有一个记录文件MANIFEST。

浅析python打包工具distutils、setuptools

四、安装模块

hello_module-1.0.tar.gz 是生成的python模块。切换到的我的python虚拟环境中,安装该模块。

浅析python打包工具distutils、setuptools

浅析python打包工具distutils、setuptools

使用python setup.py install 安装该模块。从路径可以看出,该模块安装到标准库的制定路径下。

浅析python打包工具distutils、setuptools

五、使用模块

 安装好模块之后,在python的交互环境中导入模块。模块就是hello.py文件,引用hello.py文件中的hello_fun()函数。

浅析python打包工具distutils、setuptools

setuptools

setuptools是distutils的增强版。setuptools有一个entry_points功能很方便,类似linux启动某个服务,如在linux命令行里firefox能启动火狐浏览器。

首先检验没有安装之前,命令path没有作用。

浅析python打包工具distutils、setuptools

 一、创建功能包

创建一个文件夹demo,在文件夹里创建get_path.py和__init__.py两个文件。get_path.py是功能函数,__init__.py是包的标识文件。

浅析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'
          ]
 },
)
<br data-filtered="filtered"><br data-filtered="filtered">

在配置中将该模块需要的依赖全部都写好,安装时指定地址去下载。这种方式简化了使用时的安装过程,但是还不够好。最好的方式是pip的自动下载。

三、打包

浅析python打包工具distutils、setuptools 

打包之后多出两个文件夹,分别是demo.egg-info和dist。demo.egg-info是必要的安装信息,而dist中的压缩包就是安装包。

浅析python打包工具distutils、setuptools

 查看dist/demo-0.1.tar.gz解压之后的文件。

浅析python打包工具distutils、setuptools

四、安装包

浅析python打包工具distutils、setuptools

五、使用包

安装之后在命令行中直接输入path,回车能够看到调用了get_path.py中的函数fun(),输出字符串。

浅析python打包工具distutils、setuptools

同时也可以导入使用。

浅析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,找到所有模块,生成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

总结

以上所述是小编给大家介绍的python打包工具distutils、setuptools ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python学习笔记:字典的使用示例详解
Jun 13 Python
Python简单进程锁代码实例
Apr 27 Python
python简单获取数组元素个数的方法
Jul 13 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
python用post访问restful服务接口的方法
Dec 07 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
Django ORM实现按天获取数据去重求和例子
May 18 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
浅析Django接口版本控制
Jun 26 Python
PyQt5每天必学之切换按钮
Aug 20 #Python
PyQt5每天必学之滑块控件QSlider
Apr 20 #Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 #Python
PyQt5每天必学之组合框
Apr 20 #Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 #Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 #Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 #Python
You might like
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
Vue3.x源码调试的实现方法
2019/10/13 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
Python脚本按照当前日期创建多级目录
2019/03/01 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
Python模块 _winreg操作注册表
2020/02/05 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
解决python 找不到module的问题
2020/02/12 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
会计实习自我鉴定
2013/12/04 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
公司员工手册范本
2015/05/14 职场文书
婚宴致辞
2015/07/28 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android
vue实现滑动解锁功能
2022/03/03 Vue.js
Tomcat弱口令复现及利用
2022/05/06 Servers