杰瑞科技汇

Python如何输出项目依赖requirements.txt?

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

Python如何输出项目依赖requirements.txt?-图1
(图片来源网络,侵删)

下面我将介绍几种最常用和最推荐的方法,从最简单到最健壮。

使用 pip freeze (最简单直接)

这是最基础、最广为人知的方法,适用于简单的项目或个人开发。

在终端/命令行中生成

打开你的终端(Windows 是 CMD 或 PowerShell,macOS/Linux 是 Terminal),进入你的项目根目录(即存放 .py 文件的文件夹),然后运行以下命令:

pip freeze > requirements.txt

命令解释:

Python如何输出项目依赖requirements.txt?-图2
(图片来源网络,侵删)
  • 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 文件。

Python如何输出项目依赖requirements.txt?-图3
(图片来源网络,侵删)

安装 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-compilepip-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 会做以下几件事:

  1. 解析 requirements.in 中的所有包。
  2. 递归地找出这些包的所有子依赖。
  3. 解决版本冲突,选择一个兼容所有依赖的版本组合。
  4. 生成一个最终的 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 开发者的标准做法,能从根源上避免很多依赖相关的部署问题。
分享:
扫描分享到社交APP
上一篇
下一篇