一 基本概念
1.什么是setuptools
setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。所谓分发,就是将自己做的包,安装到操作系统内。
强调一点,setuptools是在产生包时候用,到包创作完成后,用户在使用setuptools创建的包时,并不需要已安装setuptools,只要一个启动模块(__init__.py)即可。
2 setuptools功能亮点:
- 利用EasyInstall自动查找、下载、安装、升级依赖包
- 创建Python Eggs
- 包含包目录内的数据文件
- 自动包含包目录内的所有的包,而不用在setup.py中列举
- 自动包含包内和发布有关的所有相关文件,而不用创建一个MANIFEST.in文件
- 自动生成经过包装的脚本或Windows执行文件
- 支持Pyrex,即在可以setup.py中列出.pyx文件,而最终用户无须安装Pyrex
- 支持上传到PyPI
- 可以部署开发模式,使项目在sys.path中
- 用新命令或setup()参数扩展distutils,为多个项目发布/重用扩展
- 在项目setup()中简单声明entry points,创建可以自动发现扩展的应用和框架
总之,setuptools就是比distutils好用的多,基本满足大型项目的安装和发布
3 什么是python Eggs
python蛋,是用于将自己开发的安装包部署到操作系统环境下。由于python在全系统可见,因此,在python程序下,直接import xxx就可以应用。python蛋就是python代码,用unzip解压后,一看便知。
二、安装setuptools
如果python环境没有setuptools,需要安装,下面推荐两个安装方法如下:
1) 方法1:最简单安装,假定在ubuntu下
- sudo apt-get install python-setuptools
2) 方法2:启动脚本安装
- wget http://peak.telecommunity.com/dist/ez_setup.py
- sudo python ez_setup.py
三 实验1:创建一个工程,内部有一个程序,并安装到系统
1.创建一个简单的包
有了setuptools后,试图创建一个工程包demo.首先创建一个临时目录mydesk用以存放demo工程。在mydesk中,创建一个子目录(名叫demo),这就是工程的根路径。
cd /mydesk
mkdir demo
cd demo
demo是工程的根目录,进入demo,创建根目录的第一个文件:setup.py文件
from setuptools import setup, find_packages
setup(
name = "demo",
version = "0.1",
packages = find_packages(),
)
在当前目录下,执行
python3 setup.py bdist_egg
注意这条命令,形如 “ python3 setup.py xxx” 的命令很多,其中本地生成一个python-egg的命令就是xxx=bdist_egg。本地工程的“打包”动作完成。
ls
观察demo文件夹,发现setup.py旁边多了三个文件目录:build,demo.egg-info,dist,下面一一介绍其意义。
huatec@LAPTOP-J5TGQHQH:~/mydesk/demo$ tree
.
├── build
│ └── bdist.linux-x86_64
├── demo.egg-info
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ ├── dependency_links.txt
│ └── top_level.txt
├── dist
│ └── demo-0.1-py3.8.egg
└── setup.py
【1】dist目录
在dist中生成的是egg包,这是一个将来部署到python系统的文件包,是主要组成部分。
file dist/demo-0.1-py2.7.egg
./dist/demo-0.1-py3.8.egg: Zip archive data, at least v2.0 to extract
看一下生成的.egg文件,是个zip包,解开看看先
~/mydesk/demo$ unzip -l ./dist/demo-0.1-py3.8.egg
Archive: ./dist/demo-0.1-py3.8.egg
Length Date Time Name
--------- ---------- ----- ----
176 2021-11-10 09:36 EGG-INFO/PKG-INFO
120 2021-11-10 09:36 EGG-INFO/SOURCES.txt
1 2021-11-10 09:36 EGG-INFO/dependency_links.txt
1 2021-11-10 09:36 EGG-INFO/top_level.txt
1 2021-11-10 09:36 EGG-INFO/zip-safe
--------- -------
299 5 files
huatec@LAPTOP-J5TGQHQH:~/mydesk/demo$
我们可以看到,里面是一系列自动生成的文件。现在可以介绍一下刚刚setup()中的参数了
name 包名
version 版本号
packages 所包含的其他包
要想发布到PyPI中,需要增加别的参数,这个可以参考官方文档中的例子了。
【2】 demo.egg-info目录
此文件夹下,包含所有的,对python-egg的描述文件,是次要组成部分。
【3】build目录
此目录是具有C++、C语言的程序,编译过后的可调用库存在的地方,在python下一般不用。此文件夹是工程的重要组成部分。
上面生成的egg中没有实质的内容,除了可以看看结构,没有实际意义,下面添加一点内容。
2.在简单的包内追加一个程序
在demo中执行mkdir demo,再创建一个目录,在这个demo目录中创建一个__init__.py的文件,表示这个目录是一个包,然后写入:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
def test():
print("hello world!")
if __name__ == '__main__':
test()
现在的主目录结构为下:
demo
|-- demo
| `-- __init__.py
`-- setup.py
再次执行python setup.py bdist_egg后,再看egg包
$ unzip -l ./dist/demo-0.1-py3.8.egg
Archive: ./dist/demo-0.1-py3.8.egg
Length Date Time Name
--------- ---------- ----- ----
176 2021-11-10 11:15 EGG-INFO/PKG-INFO
137 2021-11-10 11:15 EGG-INFO/SOURCES.txt
1 2021-11-10 11:15 EGG-INFO/dependency_links.txt
5 2021-11-10 11:15 EGG-INFO/top_level.txt
1 2021-11-10 11:15 EGG-INFO/zip-safe
124 2021-11-10 11:12 demo/__init__.py
379 2021-11-10 11:15 demo/__pycache__/__init__.cpython-38.pyc
--------- -------
823 7 files
这回包内多了demo目录,显然已经有了我们自己的东西了.下一步将其安装到python系统。
python setup.py install
这个命令会讲我们创建的egg安装到python的dist-packages目录下,我这里的位置在
tree /usr/local/lib/python3.8/dist-packages/demo-0.1-py3.8.egg
查看一下它的结构:
$ unzip -l /usr/local/lib/python3.8/dist-packages/demo-0.1-py3.8.egg
Archive: /usr/local/lib/python3.8/dist-packages/demo-0.1-py3.8.egg
Length Date Time Name
--------- ---------- ----- ----
176 2021-11-10 11:23 EGG-INFO/PKG-INFO
137 2021-11-10 11:23 EGG-INFO/SOURCES.txt
1 2021-11-10 11:23 EGG-INFO/dependency_links.txt
5 2021-11-10 11:23 EGG-INFO/top_level.txt
1 2021-11-10 11:23 EGG-INFO/zip-safe
124 2021-11-10 11:12 demo/__init__.py
379 2021-11-10 11:23 demo/__pycache__/__init__.cpython-38.pyc
--------- -------
823 7 files
打开python终端或者ipython都行,直接导入我们的包
>>> import demo
>>> demo.test()
hello world!
>>>
好了,执行成功!
这里强调:egg文件中已经包含所有关于源程序,以及路径的信息。与/usr/local/lib/python3.8/dist-packages/下存放路径和文件完全等价
sudo unzip /usr/local/lib/python3.8/dist-packages/demo-0.1-py3.8.egg
将看到生成程序文件路径和说明文件路径。再次强调:egg就是执行程序。
更多推荐