Python的setuptools详解【1】

一 基本概念

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:启动脚本安装

三 实验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就是执行程序。 

猜你喜欢

转载自blog.csdn.net/gongdiwudu/article/details/118726517