setuptools 是 Python 生态中最基础、最重要的工具之一,它不仅仅是一个“下载器”,而是一个打包和分发工具,你使用它来将你的 Python 项目打包成标准的格式(如 wheel 或 sdist),这样其他人就可以轻松地安装你的项目。

下面我将从几个方面来回答你的问题:
- 为什么需要
setuptools? - 理解它的核心作用。 - 如何安装/下载
setuptools? - 指令和详细步骤。 - 如何使用
setuptools? - 一个简单的“Hello World”示例。 - 常见问题和进阶用法。
为什么需要 setuptools?
想象一下,你写了一个很棒的 Python 库,里面有几十个文件和文件夹,你想把它分享给同事或者发布到 PyPI(Python 官方包索引),让别人能用 pip install your-library 来安装。
直接把一堆文件扔给别人是不现实的。setuptools 就是来解决这个问题的,它的核心功能包括:
- 构建分发包:将你的项目代码打包成
.whl(Wheel) 或.tar.gz(Source Distribution) 格式,这些是标准的安装包格式。 - 管理依赖:通过
setup.py文件声明你的项目需要哪些第三方库,pip在安装时会自动处理这些依赖。 - 创建可执行程序:可以将你的 Python 脚本打包成独立的可执行文件。
- 支持插件系统:可以与
build,twine,pytest等众多工具无缝集成。
setuptools 是 Python 项目从代码到分发的桥梁。

如何安装/下载 setuptools?
setuptools 会作为 pip 的依赖被一起安装,所以你大概率已经有了它,但如果你需要手动安装或更新,方法非常简单。
使用 pip (推荐)
这是最标准、最推荐的方式,打开你的终端或命令行工具,运行以下命令:
安装最新版本的 setuptools
python -m pip install --upgrade setuptools
python -m pip是一种更可靠的调用pip的方式,可以避免系统 Python 和虚拟环境 Python 之间的路径冲突。--upgrade参数确保你安装的是最新版本。
安装特定版本
如果你需要特定版本的 setuptools,可以指定版本号:

python -m pip install setuptools==68.2.2
使用 ensurepip (用于创建纯净环境)
如果你在创建一个新的 Python 虚拟环境时,发现没有 pip 和 setuptools,可以使用 ensurepip 来引导安装它们。
# 创建一个虚拟环境并自动安装 pip 和 setuptools python -m venv myenv # 激活虚拟环境 (Windows) myenv\Scripts\activate # 激活虚拟环境 (macOS/Linux) source myenv/bin/activate # 在虚拟环境中,ensurepip 通常会自动运行 # 如果需要手动运行: python -m ensurepip --upgrade
从源码安装 (高级用户)
如果你想从最新的源码安装 setuptools(想体验开发版功能),可以从其 GitHub 仓库克隆。
# 1. 克隆仓库 git clone https://github.com/pypa/setuptools.git cd setuptools # 2. 安装 # 使用 pip 从当前目录安装 python -m pip install .
如何使用 setuptools? (一个简单示例)
创建一个项目并使用 setuptools 打包它,通常需要以下几个步骤:
步骤 1:创建项目结构
假设你的项目结构如下:
my_project/
├── my_package/
│ ├── __init__.py
│ └── utils.py
├── setup.py
└── README.md
my_package/是你的包名。__init__.py告诉 Python 这个目录是一个包。utils.py是你的代码文件。setup.py是setuptools的配置文件(核心)。README.md是项目的说明文档。
步骤 2:编写代码
my_package/utils.py
def say_hello(name):
"""一个简单的问候函数"""
return f"Hello, {name}! Welcome to the world of setuptools!"
def add(a, b):
"""一个简单的加法函数"""
return a + b
my_package/__init__.py
# 从 utils.py 导入函数,这样可以直接从包调用 from .utils import say_hello, add __version__ = "0.1.0" # 定义包的版本号
步骤 3:编写 setup.py 文件
这是最关键的一步,它定义了你的项目如何被构建和分发。
setup.py
from setuptools import setup, find_packages
# 从包的 __init__.py 中读取版本号
# 这是一个好习惯,避免版本号在多处定义
from my_package import __version__
# 使用 find_packages() 自动发现所有包
# 使用 long_description 从 README.md 读取项目描述
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setup(
name="my-awesome-project", # 项目在 PyPI 上的名称
version=__version__, # 版本号
author="Your Name", # 作者
author_email="your.email@example.com", # 作者邮箱
description="A small example package", # 简短描述
long_description=long_description, # 详细描述
long_description_content_type="text/markdown", # 描述的格式
url="https://github.com/yourusername/my_project", # 项目主页
packages=find_packages(), # 自动找到所有包
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License", # 使用 MIT 许可证
"Operating System :: OS Independent",
],
python_requires='>=3.7', # 要求的最低 Python 版本
)
步骤 4:构建你的分发包
在项目根目录(my_project/)下打开终端,运行构建命令。
# 确保你在 my_project 目录下 cd my_project # 1. 安装构建工具 (wheel, build) # 这是现代 Python 打包的标准做法 python -m pip install --upgrade build # 2. 执行构建 # 这会创建一个 dist/ 文件夹 python -m build
执行成功后,你会看到项目根目录下多了一个 dist 文件夹:
my_project/
├── dist/
│ ├── my_awesome_project-0.1.0-py3-none-any.whl
│ └── my_awesome_project-0.1.0.tar.gz
.whl文件是 Wheel 格式,是pip推荐的安装格式,安装速度更快。.tar.gz文件是源码分发格式,适用于需要编译扩展模块的项目。
步骤 5:安装和测试
你可以像安装任何其他第三方库一样安装你刚刚打包好的包。
# 安装 wheel 文件
pip install dist/my_awesome_project-0.1.0-py3-none-any.whl
# 现在可以在 Python 中导入并使用你的包了
python
>>> import my_package
>>> my_package.say_hello("Alice")
'Hello, Alice! Welcome to the world of setuptools!'
>>> my_package.add(10, 5)
15
常见问题和进阶用法
问题:ModuleNotFoundError: No module named 'setuptools'
原因:Python 环境中没有安装 setuptools。
解决:按照第 2 部分的方法,使用 python -m pip install setuptools 安装。
进阶用法:使用 pyproject.toml (现代标准)
从 Python 3.11+ 开始,社区推荐使用 pyproject.toml 来替代 setup.py。setuptools 可以通过 [build-system] 表格来配置。
pyproject.toml
[build-system]
requires = ["setuptools>=61.0"]
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 small example package"
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
# 这里可以声明依赖
# dependencies = [
# "requests>=2.20.0",
# ]
在这种情况下,你仍然需要 setup.py 或 setup.cfg 来包含一些 setuptools 特有的配置(find_packages()),但核心的元数据都移到了 pyproject.toml 中,这是未来的趋势。
| 任务 | 命令/方法 |
|---|---|
安装/更新 setuptools |
python -m pip install --upgrade setuptools |
| 创建项目 | 创建目录结构,编写代码,创建 setup.py |
| 构建分发包 | python -m pip install build python -m build |
| 安装本地包 | pip install dist/your-package.whl |
希望这份详细的指南能帮助你完全理解和使用 setuptools!
