Python:打包配置文件 setup.py 详解

简介: Python:打包配置文件 setup.py 详解

1、项目打包工具:


distutils 是 Python 的一个标准库

setuptools 是 distutils 增强版,不包括在标准库中

distribute 是 setuptools 一个分支版本

distutils2 废弃

2、安装 setuptools


文档: https://setuptools.readthedocs.io/


方式一:源码安装

https://pypi.org/project/setuptools/#files下载 zip 包解压

$ python setup.py install
  1. 方式二:通过引导程序安装
$ wget http://peak.telecommunity.com/dist/ez_setup.py
# 安装
$ python ez_setup.py
# 更新,以下两种任选
$ python ez_setup.py –U setuptools
$ pip install -U setuptools
  1. 方式三: pip安装
$ pip install --upgrade setuptools

3、使用 easy_install

安装完 setuptools 后,就有了easy_install 的第三方管理工具

  1. 包的安装
# 通过包名,从PyPI寻找最新版本,自动下载、编译、安装
$ easy_install pkg_name
# 通过包名从指定下载页寻找链接来安装或升级包
$ easy_install -f http://pythonpaste.org/package_index.html 
# 指定线上的包地址安装
$ easy_install http://example.com/path/to/MyPackage-1.2.3.tgz
# 从本地的 .egg 文件安装
$ easy_install xxx.egg
# 在安装时你可以添加额外的参数
指定安装目录:--install-dir=DIR, -d DIR
指定用户安装:--user
  1. 包的升级
# 从 pypi 中搜索并升级包
$ easy_install --upgrade pkg_name
# 指定版本进行升级
$ easy_install "SomePackage==2.0"
  1. 包的删除
$ easy_install -m pkg_name

若要删除彻底,需要手动删除相关的 .egg 及 其他文件

指定安装源

~/.pydistutils.cfg

[easy_install]
index-url=http://mirrors.aliyun.com/pypi/simple/
find-links=http://mirrors.aliyun.com/pypi/simple/

4、源码包与二进制包

源码包

常见后缀:.zip, .tar, .tar.gz, .tar.bz2, .tar.Z

安装的过程,是先解压,再编译,最后才安装。安装速度较慢, 跨平台


二进制包

常见后缀:.egg, .whl

安装过程:省去了编译的过程,直接进行解压安装。安装速度较快。


5、setup.py 的编写


简单的使用示例

from setuptools import setup, find_packages
setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module",
    # 项目主页
    url="http://www.baidu.com/", 
    # 你要安装的包,通过 setuptools.find_packages 找到当前目录下有哪些包
    packages=find_packages()
)

6.setup 参数

setup 函数常用的参数如下

image.pngimage.pngimage.png

setup.cfg 文件提供 setup.py 的默认参数

配置:https://docs.python.org/3/distutils/configfile.html


classifiers 分类信息

参见:https://pypi.org/pypi?%3Aaction=list_classifiers


示例:

from setuptools import setup, find_packages
setup(
    classifiers = [
        # 发展时期,常见的如下
        #   3 - Alpha
        #   4 - Beta
        #   5 - Production/Stable
        'Development Status :: 3 - Alpha',
        # 开发的目标用户
        'Intended Audience :: Developers',
        # 属于什么类型
        'Topic :: Software Development :: Build Tools',
        # 许可证信息
        'License :: OSI Approved :: MIT License',
        # 目标 Python 版本
        'Programming Language :: Python :: 2',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
    ]
)
  1. 文件的分发
from setuptools import setup, find_packages
setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module",
    url="http://iswbm.com/", 
    packages=find_packages(),
    # 安装过程中,需要安装的静态文件,如配置文件、service文件、图片等
    data_files=[
        ('', ['conf/*.conf']),
        ('/usr/lib/systemd/system/', ['bin/*.service']),
               ],
    # 希望被打包的文件
    package_data={
        '':['*.txt'],
        'bandwidth_reporter':['*.txt']
               },
    # 不打包某些文件
    exclude_package_data={
        'bandwidth_reporter':['*.txt']
               }
)

还可以使用 MANIFEST.in

include *.txt
recursive-include examples *.txt *.py
prune examples/sample?/build

配置:https://docs.python.org/3.6/distutils/sourcedist.html

  1. 依赖包下载安装
from setuptools import setup, find_packages
setup(
    ...
    # 表明当前模块依赖哪些包,若环境中没有,则会从pypi中下载安装
    install_requires=['docutils>=0.3'],
    # setup.py 本身要依赖的包,这通常是为一些setuptools的插件准备的配置
    # 这里列出的包,不会自动安装。
    setup_requires=['pbr'],
    # 仅在测试时需要使用的依赖,在正常发布的代码中是没有用的。
    # 在执行python setup.py test时,可以自动安装这三个库,确保测试的正常运行。
    tests_require=[
        'pytest>=3.3.1',
        'pytest-cov>=2.5.1',
    ],
    # 用于安装setup_requires或tests_require里的软件包
    # 这些信息会写入egg的 metadata 信息中
    dependency_links=[
        "http://example2.com/p/foobar-1.0.tar.gz",
    ],
    # install_requires 在安装模块时会自动安装依赖包
    # 而 extras_require 不会,这里仅表示该模块会依赖这些包
    # 但是这些包通常不会使用到,只有当你深度使用模块时,才会用到,这里需要你手动安装
    extras_require={
        'PDF':  ["ReportLab>=1.2", "RXP"],
        'reST': ["docutils>=0.3"],
    }
)
  1. 安装环境的限制
setup(
    ...
    python_requires='>=2.7, <=3',
)
  1. 生成可执行文件
from setuptools import setup, find_packages
setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module",
    url="http://iswbm.com/", 
    packages=find_packages(),
    # 用来支持自动生成脚本,安装后会自动生成 /usr/bin/foo 的可执行文件
    # 该文件入口指向 foo/main.py 的main 函数
    entry_points={
        'console_scripts': [
            'foo = foo.main:main'
        ]
    },
    # 将 bin/foo.sh 和 bar.py 脚本,生成到系统 PATH中
    # 执行 python setup.py install 后
    # 会生成 如 /usr/bin/foo.sh 和 如 /usr/bin/bar.py
    scripts=['bin/foo.sh', 'bar.py']
)

7.使用 setup.py 构建包

  1. 构建源码发布包
$ python setup.py sdist
# 指定发布包格式
$ python setup.py sdist --formats=gztar,zip
# 安装
$ easy_install xxx.tar.gz

image.png

文档: https://docs.python.org/3.6/distutils/sourcedist.html

  1. 构建二进制分发包
# exe 包
$ python setup.py bdist_wininst
# rpm 包
$ python setup.py bdist_rpm
# egg 包
$ python setup.py bdist_egg
# 生成多个格式的进制包
$ python setup.py bdist

8、使用 setup.py 安装包

# 将模块安装至系统全局环境
$ python setup.py install
# 在系统环境中创建一个软链接指向包实际所在目录
$ python setup.py develop
# 卸载
$ python setup.py develop --uninstall
$ python setup.py develop -u

9、发布包到 PyPi

~/.pypirc 配置 PyPI 访问地址和账号

[distutils]
index-servers = pypi
[pypi]
username:xxx
password:xxx
# 信息注册
$ python setup.py register
# 上传源码包
$ python setup.py upload

也可以使用 twine 工具注册上传

python setup.py sdist bdist_wheel && twine upload dist/*

参考文章

  1. 花了两天,终于把 Python 的 setup.py 给整明白了
  2. Python 库打包分发(setup.py 编写)简易指南
  3. setup.py里的几个require
相关文章
|
测试技术 Python
python接口自动化测试 - configparser配置文件解析器详细使用
python接口自动化测试 - configparser配置文件解析器详细使用
133 0
|
Python
Python3 配置文件 解析
/************************************************************************ * Python3 配置文件 解析 * 说明: * 通常写软件都会写配置,这样是为了方便调试或者这种软编码的方式可以让 * 我们变得相对来说自由那么一点。
706 0
|
30天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
29天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
17天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
151 59
|
6天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
27 14
|
16天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
53 2