地址

如何将自己的Python程序打包–setuptools详解

关于python中的setup.py

PyPI

  • PyPI:Python Package Index

  • PyPI首页网址:pypi.python.org,基本上能在这上面找到所有的扩展包。

  • PyPI主要有两大类安装方法:

    1. 自行安装

      • 从PyPI上下载的包解压后,都可以通过python setup.py install来安装。
      • 这将把程序安装到site-package目录中,把脚本安装到Scripts目录中(Linux是bin目录)。
      • 这种方式无法自动解决依赖关系
    2. 通过工具安装

      通过工具安装:常用的工具有两个:

      • easy_install
      • pip
  • easy_install 和 pip命令 :

    1. 安装:easy_install packageName
    2. 安装:easy_install package.egg
    3. 安装:pip install packageName
    4. 更新:pip install -U packageName
    5. 移除:pip uninstall packageName
    6. 搜索:pip search packageName
    7. 帮助:pip help
  • easy_install和pip这两个工具安装的软件,都涉及到一个叫egg的东西。egg包是目前最流行的python应用打包部署方式。

setuptools

  • setuptools 实际上提供了发布你自己的python package的功能
  • 它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。
  • 功能亮点:
    • 利用EasyInstall自动查找、下载、安装、升级依赖包
    • 创建Python Eggs
    • 包含包目录内的数据文件
    • 自动包含包目录内的所有的包,而不用在setup.py中列举
    • 自动包含包内和发布有关的所有相关文件,而不是创建一个MANIFEST.in文件
    • 自动生成经过包装的脚本或Windows执行文件
    • 支持Pyrex,即在可以setup.py中列出.pyx文件,而最终用户无需安装Pyrex
    • 支持上传到PyPI
    • 可以部署开发模式,使项目在sys.path中
    • 用新命令或setup()参数扩展distutils,为多个项目发布/重用扩展
    • 在项目setup()中简单声明entry points,创建可以自动发现扩展的应用和框架

setup函数

  • setup函数中大部分是描述性东西。
  • 最主要的是package参数,可以手动列出所有的package,也可以用用自带的find_packages来动态获取package。
  • setup函数包含的参数解释
    –name 包名称————生成的egg名称
    –version (-V) 包版本—-生成egg包的版本号
    –author 程序的作者——包的制作者名字
    –author_email 程序的作者的邮箱地址
    –maintainer 维护者
    –maintainer_email 维护者的邮箱地址
    –url 程序的官网地址
    –license 程序的授权信息
    –description 程序的简单描述——-程序的概要介绍
    –long_description 程序的详细描述—程序的详细描述
    –platforms 程序适用的软件平台列表
    –classifiers 程序的所属分类列表
    –keywords 程序的关键字列表
    –packages 需要处理的包目录(包含__init__.py的文件夹)——-和setup.py同一目录下搜索各个含有 init.py的包
    –py_modules 需要打包的python文件列表
    –download_url 程序的下载地址
    –cmdclass
    –data_files 打包时需要打包的数据文件,如图片,配置文件等
    –scripts 安装时需要执行的脚步列表
    –package_dir 告诉setuptools哪些目录下的文件被映射到哪个源码包。一个例子:package_dir = {‘’: ‘lib’},表示“root package”中的模块都在lib 目录中。
    –requires 定义依赖哪些模块
    –provides定义可以为哪些模块提供依赖
    –find_packages() 对于简单工程来说,手动增加packages参数很容易,刚刚我们用到了这个函数,它默认在和setup.py同一目录下搜索各个含有 init.py的包。
    其实我们可以将包统一放在一个src目录中,另外,这个包内可能还有aaa.txt文件和data数据文件夹。另外,也可以排除一些特定的包
    find_packages(exclude=[“.tests”, “.tests.“, “tests.“, “tests”])
    –install_requires = [“requests”] 需要安装的依赖包
    –entry_points 动态发现服务和插件
1
2
3
4
5
6
7
8
9
10
11
from setuptools import setup,find_packages

setup(
name = 'hyldemo',
version = '0.1',
packages = find_packages(),
description='this is my demo test',
author = 'hyl',
author_email = 'None',
url = 'None'
)
  1. 写好函数之后需要检查setup.py是否有错误或警告

    1
    python setup.py check
  2. 执行python setup.py bdist_egg即可打包一个test的包了。

  3. 在当前目录下,会创建dist目录,里面有个文件名为demo-0.1-py3.7.egg,这个就是可以分发的包。

  4. 使用者拿到这个包后,解压,到demo-0.1目录下执行:python setup.py install,那么,foo.py就会被拷贝到python类路径下,可以被导入使用(如果安装是egg文件,会把egg文件拷贝到dist-packages目录下)。

执行sdist命令时,默认会打包哪些东西呢?

  • 所有由py_modulespackages指定的源码文件
  • 所有由ext_moduleslibraries指定的C源码文件
  • scripts指定的脚本文件
  • 类似于test/test*.py的文件
  • README.txt或README,setup.py,setup.cfg
  • 所有package_datadata_files指定的文件