Python-分发工具初探之-setuptools
2016-03-23 00:13
567 查看
这篇文章主要介绍了一下 setuptools 是什么,以及它的功能和特点,并且介绍了如何使用它来创建和安装使用自己的包,这篇文章仅仅讲了最基本的功能和用法,一些对于进阶的用法会在下篇文章中进行介绍。
实现这样的的包管理机制主要由两部分构成:
一个存储在 Python 官方网站的集中式仓库,名叫 Python Package Index(PyPI)
另外就是基于 disutils 开发的 setuptools 包管理系统
它提供的内容包括:
用来提供标准元数据字段:诸如作者名、版权类型等信息的骨架
一组用来将包中的代码来构建软件安装包的辅助工具
disutils 仅仅适用于包,它无法定义包之间的依赖关系。但是 setuptools 通过添加一个基本的依赖系统以及许多相关功能,弥补了该缺陷。他还提供了自动包查询程序,用来自动获取包之间的依赖关系,并完成这些包的安装,大大降低了安装各种包的难度,使之更加方便。
能够创建 Python Eggs、
包含目录中的数据文件和包,不需要在
自动包含包内和发布有关的所有相关文件,而不用创建一个
自动生成经过包装的脚本
支持Pyrex,即在可以
支持上传到 PyPI
可以部署开发模式,使项目在sys.path中
用新命令或
在项目的
安装 setuputils:
在目录下新建
将该项目打包
这时我们查看该项目目录:
我们看到在
以上的程序是最简单的一个
在项目目录新建一个目录:
* 新建
再次生成 egg 包:
查看 egg 包内容:
我们看到其中已经多了
然后该包就会安装到 Python 的
这时我们可以在 Python 终端测试我们的包:
我们看到我们编写的包已经成功运行!
本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!
0x00 setuptools 是什么
setuptools 与 disutils
我们通常所知道的 Python 分发工具是 Python disutils, setuptools 可以说是它的增强版,它能帮助我们更好的创建和分发 Python 的包,尤其是具有复杂依赖关系的包。对于开发者来说,能够更好的组织自己项目的分发和发布;对于用户来说,不需要安装 setuputils 也可以使用由它创建的包,只需要一个启动模块即可。实现这样的的包管理机制主要由两部分构成:
一个存储在 Python 官方网站的集中式仓库,名叫 Python Package Index(PyPI)
另外就是基于 disutils 开发的 setuptools 包管理系统
它提供的内容包括:
用来提供标准元数据字段:诸如作者名、版权类型等信息的骨架
一组用来将包中的代码来构建软件安装包的辅助工具
disutils 仅仅适用于包,它无法定义包之间的依赖关系。但是 setuptools 通过添加一个基本的依赖系统以及许多相关功能,弥补了该缺陷。他还提供了自动包查询程序,用来自动获取包之间的依赖关系,并完成这些包的安装,大大降低了安装各种包的难度,使之更加方便。
相关功能
利用 EasyInstall 自动查找、下载、安装升级依赖包能够创建 Python Eggs、
包含目录中的数据文件和包,不需要在
setup()函数中一一列举出来
自动包含包内和发布有关的所有相关文件,而不用创建一个
MANIFEST.in文件
自动生成经过包装的脚本
支持Pyrex,即在可以
setup.py中列出
.pyx文件,而最终用户无须安装Pyrex
支持上传到 PyPI
可以部署开发模式,使项目在sys.path中
用新命令或
setup()参数扩展distutils,为多个项目发布/重用扩展
在项目的
setup()中简单声明
entry points,创建可以自动发现扩展的应用和框架
0x01 安装 setuptools
**Ubuntu:
sudo apt-get install python-setuptools
Mac:
安装 wget:curl -O http://ftp.gnu.org/gnu/wget/wget-1.13.4.tar.gz tar -xzvf wget-1.13.4.tar.gz cd wget-1.13.4 ./configure make sudo make install
安装 setuputils:
wget http://peak.telecommunity.com/dist/ez_setup.py sudo python ez_setup.py
0x02 创建一个简单的包
创建一个空的包
新建一个 demo 目录mkdir demo1 cd demo1
在目录下新建
setup.py文件
from setuptools import setup, find_packages setup( name = 'demo1', version = '0.1', packages = find_packages(), )
将该项目打包
python setup.py bdist_egg
这时我们查看该项目目录:
demo1 |--build | `--bdist.macosx-10.11-intel |--demo1.egg-info | |--dependency_links.txt | |--PKG-INFO | |--SOURCES.txt | `--top_level.txt |--dist | `--demo1-0.1-py2.7.egg `--setup.py
我们看到在
dist目录中的就是生成的 egg 包,将其解压:
unzip -l demo1-0.1-py2.7.egg Archive: demo1-0.1-py2.7.egg Length Date Time Name -------- ---- ---- ---- 1 03-22-16 23:29 EGG-INFO/dependency_links.txt 177 03-22-16 23:29 EGG-INFO/PKG-INFO 124 03-22-16 23:29 EGG-INFO/SOURCES.txt 1 03-22-16 23:29 EGG-INFO/top_level.txt 1 03-22-16 23:29 EGG-INFO/zip-safe -------- ------- 304 5 files
以上的程序是最简单的一个
setup.py程序,如果想要发布到 PyPI 就需要参考官方给出的示例:
from setuptools import setup, find_packages setup( name = "HelloWorld", version = "0.1", packages = find_packages(), scripts = ['say_hello.py'], # Project uses reStructuredText, so ensure that the docutils get # installed or upgraded on the target machine install_requires = ['docutils>=0.3'], package_data = { # If any package contains *.txt or *.rst files, include them: '': ['*.txt', '*.rst'], # And include any *.msg files found in the 'hello' package, too: 'hello': ['*.msg'], }, # metadata for upload to PyPI author = "Me", author_email = "me@example.com", description = "This is an Example Package", license = "PSF", keywords = "hello world example examples", url = "http://example.com/HelloWorld/", # project home page, if any # could also include long_description, download_url, classifiers, etc. )
给包中添加内容
我们上边生成的 egg 是一个空的,没有实际的内容,现在我们来添加一些内容:在项目目录新建一个目录:
mkdir test cd test
* 新建
__init__.py,加入如下代码:*
#-*- coding:utf-8 -*- def test(): print "hello world!" if __name__ == '__main__': test()
再次生成 egg 包:
python setup.py bdist_egg
查看 egg 包内容:
unzip -l demo1-0.1-py2.7.egg Archive: demo1-0.1-py2.7.egg Length Date Time Name -------- ---- ---- ---- 1 03-22-16 23:51 EGG-INFO/dependency_links.txt 177 03-22-16 23:51 EGG-INFO/PKG-INFO 141 03-22-16 23:51 EGG-INFO/SOURCES.txt 5 03-22-16 23:51 EGG-INFO/top_level.txt 1 03-22-16 23:51 EGG-INFO/zip-safe 102 03-22-16 23:48 test/__init__.py 354 03-22-16 23:51 test/__init__.pyc -------- ------- 781 7 files
我们看到其中已经多了
test目录和
__init__.py,然后我们就可以尝试安装一下我们自己的包:
sudo python setup.py install
然后该包就会安装到 Python 的
site-packages目录下,在我的电脑上为
/Library/Python/2.7/site-packages/demo1-0.1-py2.7.egg
这时我们可以在 Python 终端测试我们的包:
Python 2.7.10 (default, Oct 23 2015, 18:05:06) [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import test >>> test.test() hello world!
我们看到我们编写的包已经成功运行!
0x02 总结
这篇文章主要介绍了一下 setuptools 是什么,以及它的功能和特点,并且介绍了如何使用它来创建和安装使用自己的包,这篇文章仅仅讲了最基本的功能和用法,一些对于进阶的用法会在下篇文章中进行介绍。本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!
相关文章推荐
- python enumerate
- 在windows系统中实现python3安装lxml
- Eclipse中Python开发环境搭建简单教程
- python各种语言间时间的转化实现代码
- python 时间戳与格式化时间的转化实现代码
- python 回调函数和回调方法的实现分析
- python检测xen下虚拟机的状态
- [python]Python中from...import与import......as与with.....as
- python之类-django进阶
- 用Python 连接mysql数据库
- numpy库常用函数记录(不断更新)
- python学习(二):函数
- 简明Python教程学习笔记_6_面向对象编程
- Python3.5.1 RSA加密
- Python 基础——sorted
- Python Challlenge 12
- Python基础--人们一些最爱的标准库(random time)
- Python基础--人们一些最爱的标准库(random time)
- python集合
- python 跳出两层for循环