如何生成不包含子依赖的Python requirements.txt文件?
刚从JS转Python确实会有这种困惑,毕竟npm和pip的依赖管理逻辑差别还挺大的——npm只会把你手动安装的直接依赖写入package.json,子依赖藏在node_modules里不会暴露出来,但默认的pip freeze会一股脑把环境里所有安装的包(包括层层嵌套的子依赖)都列出来,确实不太友好。下面给你几种实用的解决办法:
方法一:手动维护(适合小型项目)
最简单直接的方式就是自己手动管理requirements.txt,只把你主动安装的包写进去就行。比如你安装了llama_index,那就在文件里写:
llama-index==0.5.12
每次新安装一个直接依赖时,就把对应的包名和版本号加进去,这样文件里就只会有你需要的核心依赖,不会混入子依赖。
方法二:用pipreqs自动扫描项目依赖
如果觉得手动维护麻烦,可以用pipreqs工具——它会扫描你项目代码里实际导入的包,自动生成只包含这些直接依赖的requirements.txt,完全不会把子依赖算进去。步骤如下:
- 先安装
pipreqs:
pip install pipreqs
- 进入你的项目根目录,运行命令生成文件:
pipreqs ./
- 如果遇到编码报错,可以加上编码参数:
pipreqs ./ --encoding=utf8
这个工具的好处是能精准识别你代码里用到的依赖,避免手动遗漏或写错包名。
方法三:用pip-tools做依赖版本管理(适合大型项目)
如果你的项目比较复杂,需要严格控制依赖版本,可以用pip-tools套装。它的思路是维护一个精简的requirements.in文件(只写直接依赖),再通过工具生成包含精确版本的requirements.txt(虽然这个文件还是会包含子依赖,但你只需要维护前者):
- 安装
pip-tools:
pip install pip-tools
- 在项目根目录创建
requirements.in,写入你的直接依赖:
llama-index
- 运行命令生成带有精确版本的
requirements.txt:
pip-compile requirements.in
- 部署或安装依赖时,用
pip-sync来同步环境:
pip-sync requirements.txt
这种方式既能保持直接依赖的简洁,又能确保所有依赖的版本一致,适合团队协作或大型项目。
补充:为什么pip freeze会包含子依赖?
这是Python和JS依赖管理的设计差异:npm会把直接依赖和子依赖分层存储,package.json只记录你主动安装的包;而pip默认是把所有包都安装在同一个环境里,pip freeze只是简单枚举当前环境里的所有包,所以会把子依赖也列出来。
备注:内容来源于stack exchange,提问作者yoty66




