Python-分发工具初探之-setuptools

举报
远航 | FIBOS 发表于 2020/12/02 23:51:07 2020/12/02
【摘要】 这篇文章主要介绍了一下 setuptools 是什么,以及它的功能和特点,并且介绍了如何使用它来创建和安装使用自己的包,这篇文章仅仅讲了最基本的功能和用法,一些对于进阶的用法会在下篇文章中进行介绍。 0x00 setuptools 是什么 setuptools 与 disutils 我们通常所知道的 Python 分发工具是 Python disutils...

这篇文章主要介绍了一下 setuptools 是什么,以及它的功能和特点,并且介绍了如何使用它来创建和安装使用自己的包,这篇文章仅仅讲了最基本的功能和用法,一些对于进阶的用法会在下篇文章中进行介绍。

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
  
 
  • 1

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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

安装 setuputils:

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
  
 
  • 1
  • 2

0x02 创建一个简单的包

创建一个空的包

新建一个 demo 目录

mkdir demo1
cd demo1
  
 
  • 1
  • 2

在目录下新建 setup.py 文件

from setuptools import setup, find_packages

setup(
name = 'demo1',
version = '0.1',
packages = find_packages(),
)
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

将该项目打包

python setup.py bdist_egg
  
 
  • 1

这时我们查看该项目目录:

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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

我们看到在 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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

以上的程序是最简单的一个 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.
)
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

给包中添加内容

我们上边生成的 egg 是一个空的,没有实际的内容,现在我们来添加一些内容:

在项目目录新建一个目录:

mkdir test
cd test
  
 
  • 1
  • 2

* 新建 __init__.py,加入如下代码:*

#-*- coding:utf-8 -*-

def test():
print "hello world!" if __name__ == '__main__':
test()
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

再次生成 egg 包:

python setup.py bdist_egg
  
 
  • 1

查看 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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

我们看到其中已经多了 test 目录和 __init__.py,然后我们就可以尝试安装一下我们自己的包:

sudo python setup.py install
  
 
  • 1

然后该包就会安装到 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!
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们看到我们编写的包已经成功运行!

0x02 总结

这篇文章主要介绍了一下 setuptools 是什么,以及它的功能和特点,并且介绍了如何使用它来创建和安装使用自己的包,这篇文章仅仅讲了最基本的功能和用法,一些对于进阶的用法会在下篇文章中进行介绍。


本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!

文章来源: blog.csdn.net,作者:冰水比水冰,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/luoyhang003/article/details/50959788

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。