Python项目如何生成主依赖级别的requirement.txt文件

一、怎么生成主依赖级别的requirement.txt文件

# 安装
pip install pip-chill

# 使用
pip-chill > requirements.txt

pip-chill会列出所有的直接依赖(不包括间接依赖),并且默认不带版本号(也可以带版本号)。如果要带版本号,则:

pip-chill --no-version > requirements.txt # 不带版本号
pip-chill --all # 带版本号,但是会包括间接依赖(默认行为只输出直接依赖且带版本号)

注意:默认不带参数运行pip-chill会输出直接依赖(有版本号),所以直接重定向即可。

二、pip-chill 为什么不包含 Python 版本

pip-chill > requirements.txt 命令生成的依赖文件不包含 Python 版本是一个设计选择,并不是功能缺陷。原因如下:

1. 核心设计目标不同

  • pip-chill 专注于输出用户显式安装的包(项目直接依赖)
  • 它的输出格式类似于 pip freeze,不包含环境元信息
  • Python 解释器版本被视为环境属性而非项目依赖

2. Python 版本的多重角色

  • Python 解释器是依赖的先决条件​(前提)
  • Python 版本选择应在以下位置定义:
    • pyproject.toml(现代标准)
    • setup.py 或 setup.cfg
    • runtime.txt(平台如 Heroku)
    • Dockerfile
    • .python-version(pyenv)

3. 技术限制

  • pip list API(pip-chill 的基础)不提供 Python 版本信息
  • Python 版本与包管理器职责分离(pip 只管理包,不管理解释器)

三、为什么有的依赖没有生成到 requirements.txt

1. ​pip-chill 的工作机制*

  • pip-chill 只显示顶层依赖(您直接安装的包)
  • aiohttp 很可能是某个依赖包的子依赖(如 streamlit 的依赖)
  • 默认情况下 pip-chill 不会显示这些子依赖

2. ​依赖安装方式

  • 如果您是通过 pip install package 安装的包,它会显示为顶层依赖
  • 如果依赖是自动安装的子依赖,它不会出现在顶层列表中

3. ​项目结构

  • 您的 pip-chill 输出显示 streamlit==1.45.1
  • streamlit 依赖 aiohttp(特别是较新版本)

4.解决方案

方法 1:强制包含所有依赖(推荐)

# 生成包含所有依赖的 requirements.txt
pip freeze > requirements.txt

# 检查是否包含 aiohttp
grep aiohttp requirements.txt

方法 2:使用 pip-chill 包含子依赖

# 显示所有依赖(包括子依赖)
pip-chill --all

# 输出到文件
pip-chill --all > requirements.txt

方法 3:手动添加缺失依赖

# 添加 aiohttp 到 requirements.txt
echo "aiohttp==3.9.5" >> requirements.txt

# 安装并验证
pip install -r requirements.txt
python -c "import aiohttp; print(aiohttp.__version__)"

四、怎么在 requirements.txt 中指定镜像源?

由于有的依赖包安装会遇到网络原因导致下载不成功,所以想考虑指定镜像源方式,有如下方法:

方法 1:在 requirements.txt 中直接指定镜像源(推荐)

在 requirements.txt 文件开头添加镜像源配置:

--index-url https://mirrors.aliyun.com/pypi/simple/
--trusted-host mirrors.aliyun.com

# 依赖列表
streamlit==1.45.1
pymupdf==1.24.0
aiohttp==3.9.5
python-dotenv==1.1.0
openpyxl==3.1.5

安装命令:

pip install -r requirements.txt

方法 2:为单个包指定镜像源

# 使用阿里云源安装特定包
pymupdf==1.24.0 --index-url https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

# 其他包
streamlit==1.45.1
aiohttp==3.9.5

你可能感兴趣的:(python,linux,开发语言)