在 Python 中,"输出 requirements" 通常指的是生成一个名为 requirements.txt 的文件,该文件列出了当前项目所依赖的所有 Python 包及其精确的版本号,这对于项目的可复现性、团队协作和部署至关重要。

下面我将介绍几种最常用和最推荐的方法,从最简单到最健壮。
使用 pip freeze (最简单直接)
这是最基础、最广为人知的方法,适用于简单的项目或个人开发。
在终端/命令行中生成
打开你的终端(Windows 是 CMD 或 PowerShell,macOS/Linux 是 Terminal),进入你的项目根目录(即存放 .py 文件的文件夹),然后运行以下命令:
pip freeze > requirements.txt
命令解释:

pip freeze: 这个命令会列出你当前 Python 环境中所有已安装的包及其版本。>: 这个是输出重定向符号,它会把pip freeze命令的输出结果写入到后面的文件中,如果文件不存在,它会创建;如果文件存在,它会覆盖。
生成的 requirements.txt 文件内容示例:
absl-py==1.4.0
astunparse==1.6.3
certifi==2025.12.7
charset-normalizer==3.1.0
...
在 Python 脚本中生成
你也可以直接在 Python 代码里完成这个操作,这在你需要自动化某些流程时很有用。
import subprocess
import sys
def generate_requirements_txt():
# 获取当前 Python 解释器的路径
python_executable = sys.executable
# 执行 pip freeze 命令并捕获输出
result = subprocess.run([python_executable, '-m', 'pip', 'freeze'], capture_output=True, text=True)
if result.returncode == 0:
# 将输出写入 requirements.txt 文件
with open('requirements.txt', 'w', encoding='utf-8') as f:
f.write(result.stdout)
print("requirements.txt has been generated successfully.")
else:
print("Failed to generate requirements.txt.")
print("Error:", result.stderr)
# 调用函数
generate_requirements_txt()
使用 pipreqs (更推荐,只导出项目实际依赖的包)
pip freeze 的一个主要问题是它会导出你环境中所有安装的包,包括那些与你的项目无关的开发工具或全局包,这会导致 requirements.txt 文件变得非常臃肿。
pipreqs 是一个更智能的工具,它会扫描你的 Python 代码,找出所有通过 import 语句引入的包,然后查询这些包的版本信息,并生成一个精简的 requirements.txt 文件。

安装 pipreqs
你需要安装这个工具:
pip install pipreqs
生成 requirements.txt
在你的项目根目录下运行:
pipreqs .
命令解释:
pipreqs: 执行pipreqs命令。- 指定要扫描的目录, 表示当前目录。
生成的 requirements.txt 文件内容示例 (非常干净):
Flask==2.2.3
requests==2.28.2
Pillow==9.4.0
pipreqs 的常用选项
-
指定输出文件名:
pipreqs . --encoding=utf8 --force
--encoding=utf8: 指定编码,避免在某些系统上出现编码错误。--force:requirements.txt文件已存在,则强制覆盖它。
-
指定 Python 解释器: 如果你使用的是虚拟环境,最好明确指定解释器路径,以确保扫描的是正确的环境中的包。
pipreqs /path/to/your/project --python /path/to/your/venv/bin/python
使用 pip-tools (最健壮,用于管理复杂的依赖关系)
对于大型或生产级项目,推荐使用 pip-tools,它提供了一对强大的工具:pip-compile 和 pip-sync,可以帮你精确地管理依赖关系,并解决版本冲突。
这个方法的核心思想是使用一个名为 requirements.in 的文件,它只包含你直接依赖的包(不写版本号),然后由 pip-compile 自动计算出所有依赖(包括子依赖)的精确版本,并生成最终的 requirements.txt。
安装 pip-tools
pip install pip-tools
创建 requirements.in 文件
在你的项目根目录下创建一个名为 requirements.in 的文件,并写入你需要的包,不指定版本。
requirements.in 内容示例:
Flask
requests
gunicorn
编译生成 requirements.txt
运行以下命令:
pip-compile requirements.in
pip-compile 会做以下几件事:
- 解析
requirements.in中的所有包。 - 递归地找出这些包的所有子依赖。
- 解决版本冲突,选择一个兼容所有依赖的版本组合。
- 生成一个最终的
requirements.txt文件。
生成的 requirements.txt 文件内容示例 (非常详细和精确):
#
# This file is autogenerated by pip-compile with Python 3.9
# To update, run:
#
# pip-compile requirements.in
#
certifi==2025.12.7 # via requests
charset-normalizer==3.1.0 # via requests
click==8.1.3 # via flask, gunicorn
...
Flask==2.2.3 # via -r requirements.in
gunicorn==21.2.0 # via -r requirements.in
idna==3.4 # via requests
itsdangerous==2.1.2 # via flask
...
requests==2.28.2 # via -r requirements.in
urllib3==1.26.14 # via requests
werkzeug==2.2.3 # via flask
pip-tools 的工作流:
- 当你需要添加新依赖时,你只需要编辑
requirements.in文件。 - 然后再次运行
pip-compile,它会自动更新requirements.txt。 - 你可以使用
pip-sync requirements.txt来将你的虚拟环境同步到这个精确的依赖状态。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
pip freeze |
- 简单,无需安装额外工具 - 内置于 pip |
- 会导出所有环境包,文件臃肿 - 无法区分项目依赖和环境依赖 |
- 快速临时记录 - 非常简单的个人脚本项目 |
pipreqs |
- 只导出项目实际依赖,文件精简 - 自动扫描代码,不易遗漏 |
- 可能无法检测到通过动态导入 (__import__) 的包- 需要安装第三方工具 |
- 中小型项目 - 需要保持 requirements.txt 干净的场景 |
pip-tools |
- 最精确、最可靠,解决版本冲突 - 区分“直接依赖”和“间接依赖” - 工作流清晰,适合团队协作和CI/CD |
- 需要安装第三方工具 - 工作流程稍复杂(需要维护 .in 文件) |
- 大型、复杂的生产项目 - 对依赖版本有严格要求的项目 - 需要自动化部署和持续集成的场景 |
推荐实践:
- 对于初学者或小型项目:从
pipreqs开始,它能很好地平衡易用性和结果质量。 - 对于任何严肃的项目:强烈建议学习并使用
pip-tools,这是专业 Python 开发者的标准做法,能从根源上避免很多依赖相关的部署问题。
