python setuptools工具使用解析

本文详细介绍了Python的setuptools库,包括其基本概念、安装方法及如何使用setuptools进行Python项目的打包和发布。通过示例展示了如何创建Python Egg并安装到Python环境中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 基本概念

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
  1. 方法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

打开python终端或者ipython都行,直接导入我们的包

>>> import demo
>>> demo.test()
hello world!
>>>

再次强调:egg就是执行程序。
值得注意的是: 上方提到安装python包到系统时使用的是python setup.py install, 当然还有其他方式如python setup.py develop,两者主要区别是python setup.py install:主要是安装典型第三方包,这种包比较稳定,不再需要你去编辑、修改或是调试。而python setup.py develop适合当你安装一个包后,这个包需要你不断修改,使用这种安装方式这样你就不用每次修改后都重新安装。原理如下:
请添加图片描述

四、setuptools 中重要参数 find_packages()

如何创建以上的包,我们在上文展示如何通过"Python蛋",将自己的一个程序安装到python环境中。下面指出,如何使用find_packages()将更多个资源打包成python蛋,并解释如何调用。

实验3:find_packages()使用

1. 准备工作
当前测试的目录是 /tmp/demo;创建目录-文件结构:

`-- demo
    |-- helloapp
    |   |-- hello.py
    |   `-- __init__.py
    |-- __init__.py
    |-- myapp
    |   |-- __init__.py
    |   `-- myapp.py
    `-- setup.py

2.编辑 setup.py

from setuptools import setup, find_packages
setup(
    name="demo",
    version="1.0",
    author="zbj",
    author_email="22@qq.com",
    packages=find_packages( exclude=["*.tests", "*.tests.*", "tests"] ) #排除tests等
)

3.编辑 hello.py

def hello_func():
    print("HelloWorld")

4.编辑 myapp.py

def myapp_func():
    print("嘿嘿嘿")

这里专门解释find_packages()是啥东西?
就是在当前目录,以及当前目录下,所有的python包(带__init__.py的目录)都搜索,并一起打成egg文件包。

find_packages(xyz),就是搜索名称为xyz的包,以及xyz的下层目录的包搜索出来,并一起打成egg文件包。

5. 源码安装
进入setup.py所在的那层目录
cd /tmp/demo
检查setup.py 是否有错误(warning不是错误)

python setup.py check

安装

python setup.py install

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值