python打包工具setuptools
setuptools 是 Python 的一个库,它是用于创建和管理 Python 包(Package)和分发(Distribution)的事实标准工具。 它的主要目的是让你能够轻松地打包你的 Python 项目,以便于分发和安装。
简单来说,它帮你把一堆 .py 文件、数据文件、文档等,打包成一个源代码分发包(sdist,通常是 .tar.gz 文件)或一个构建分发包(wheel,通常是 .whl 文件)。然后,用户可以使用 pip 来安装这些包。
它解决了什么问题?
想象一下,如果没有 setuptools/pip,你要如何分享你的项目?
- 你把代码发给别人。
- 他们需要手动将文件复制到正确的目录。
- 他们需要手动安装所有依赖项。
- 如果项目有 C 扩展,他们需要手动编译,这在不同平台上会非常复杂。
setuptools 将这个过程完全自动化了:
你:用 setuptools 定义一个配置文件(如 setup.py 或 setup.cfg 或 pyproject.toml),声明项目元信息(名字、版本、作者等)、依赖项、入口点等。
你:使用 setuptools 的命令行工具(或通过 pip)来构建分发包。
用户:只需一条命令 pip install your-package-name 即可完成所有安装步骤(依赖解析、编译、复制文件等)。
核心功能与概念
项目元数据(Metadata):
定义包的基本信息,如 name, version, author, description, url, license 等。这些信息会出现在 PyPI(Python Package Index)上,并被 pip 识别。
依赖管理(Dependency Management):
install_requires:声明你的包运行时必须依赖哪些其他包。当用户用 pip 安装你的包时,这些依赖会自动被安装。
extras_require:声明一些可选的依赖组,用于安装额外的功能。例如 pip install "your-package[dev]" 会安装开发所需的额外依赖。
包发现(Package Discovery):
自动在项目目录中找到所有的包(即包含 __init__.py 的文件夹),你无需手动列出它们。你也可以通过 packages 参数手动指定。
入口点(Entry Points):
这是一个非常强大的功能,它允许你:
创建命令行工具:定义一个函数,然后通过入口点注册,setuptools 会自动为你生成一个命令行脚本。用户安装你的包后,就可以直接在终端中使用这个命令。
# setup.py
entry_points={
'console_scripts': [
'my-command = my_package.module:main_function',
],}
插件系统:其他包可以定义入口点,你的包可以去发现并加载这些入口点,从而实现灵活的插件架构。
包含非代码文件:
通过 package_data 和 include_package_data 参数,你可以将模板、静态文件(如 CSS/JS)、配置文件等一并打包到分发包中。
如何使用?
历史上,setuptools 主要通过一个名为 setup.py 的 Python 脚本来配置。
传统方式(setup.py):
from setuptools import setup, find_packages
setup(
name="my-awesome-project",
version="0.1.0",
author="Your Name",
author_email="your.email@example.com",
description="A short description of my project",
long_description=open('README.md').read(),
long_description_content_type="text/markdown",
url="https://github.com/you/my-awesome-project",
packages=find_packages(), # 自动发现所有包
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[ # 声明依赖
'requests>=2.25.1',
'numpy',
],
entry_points={ # 创建命令行工具
'console_scripts': [
'my-cli-tool = my_package.cli:main',
],
},
package_data={ # 包含包内的数据文件
'my_package': ['data/*.json', 'templates/*.html'],
},)
然后,你可以使用以下命令来构建和安装:
# 从源代码就地安装(用于开发)
pip install -e .
# 构建源代码分发包
python setup.py sdist
# 构建 wheel 分发包
python setup.py bdist_wheel
现代方式(pyproject.toml):
随着 PEP 518 和 PEP 621 的推出,现代 Python 打包更推荐将配置移到一个 pyproject.toml 文件中,这更清晰,且不依赖于特定的构建工具。
toml
# pyproject.toml[build-system]requires = ["setuptools>=61.0.0", "wheel"]build-backend = "setuptools.build_meta"
[project]name = "my-awesome-project"version = "0.1.0"authors = [
{ name="Your Name", email="your.email@example.com" },]description = "A short description of my project"readme = "README.md"requires-python = ">=3.6"license = { file = "LICENSE" }classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",]
dependencies = [
"requests>=2.25.1",
"numpy",]
[project.scripts]my-cli-tool = "my_package.cli:main"
[tool.setuptools.package-data]my_package = ["data/*.json", "templates/*.html"]
使用 pip 来构建和安装(这是现代的最佳实践):
# 从源代码安装(用于开发)
pip install -e .
# 构建分发包 (这会同时生成 sdist 和 wheel)
pip install build
python -m build
总结
特性 | 描述 |
是什么 | Python 打包的事实标准工具。 |
核心作用 | 将你的代码、依赖、元信息等打包成一个可分发的格式。 |
关键功能 | 元数据管理、依赖声明、自动包发现、创建命令行工具、插件系统。 |
配置文件 | 传统用 setup.py,现代用 pyproject.toml。 |
如何使用 | 编写配置文件,然后用 pip install . 安装或用 python -m build 构建分发包。 |
与 pip 关系 | setuptools 负责构建包,pip 负责安装包(包括从 PyPI 下载、解决依赖等)。 |
可以说,setuptools 是现代 Python 生态(PyPI 和 pip)的基石之一,没有它,Python 的包管理不会像今天这样强大和便捷。