pipreqs仅扫描显式import包且不锁定子依赖,易引发兼容性问题;推荐用pip-tools通过requirements.in生成带哈希的完整依赖树;vscode调试需手动配置launch.json中python路径;禁用pip freeze直接生成requirements.txt。

pipreqs 只扫 import,但不处理子依赖版本
用 pipreqs . --force 生成的 requirements.txt 确实只包含代码里显式 import 的包,比如 requests、numpy,但它**不锁定这些包的子依赖**(如 urllib3、certifi)。这意味着下次 pip install -r requirements.txt 时,可能拉到新版子依赖,引发兼容性问题。
实操建议:
华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。
- 生成后手动检查是否遗漏间接依赖:运行
pip show requests,看它依赖哪些包,再确认这些包是否也在requirements.txt中显式列出 - 若项目较重(如含 Flask/Django),建议改用
pip-tools,它会递归解析并锁定全链依赖 - 不要把
pipreqs输出直接用于 CI/CD——它适合初始建模,不适合生产部署
pip-tools 编译 requirements.in 才真正锁定全依赖树
pip-compile 不是简单 dump 当前环境,而是从顶层声明出发,计算出所有可复现的精确版本组合。它依赖 requirements.in(你手写的“我要什么”)和 requirements.txt(它生成的“最终确定什么”)两层结构。
实操建议:
- 在项目根目录新建
requirements.in,只写顶层包,例如:requests==2.31.0<br>click>=8.0<br>pydantic
- 运行
pip-compile requirements.in,生成带完整哈希和子依赖的requirements.txt - 每次更新依赖,只改
requirements.in,再重新pip-compile—— 避免手动编辑requirements.txt导致版本错乱 - 注意:必须确保当前终端激活的是目标虚拟环境,否则
pip-compile会读错已安装包版本
VSCode 调试时仍报 ModuleNotFoundError?检查 launch.json 的 python 字段
即使 python.defaultInterpreterPath 设置正确,VSCode 调试器默认仍可能忽略它,尤其当你没显式指定解释器路径时。这时候 pip install 成功了,但调试启动失败,错误仍是 ModuleNotFoundError。
实操建议:
- 打开
.vscode/launch.json,确认"python"字段指向虚拟环境里的解释器,例如:"python": "./venv/bin/python"
(macOS/Linux)或"python": ".\venv\Scripts\python.exe"
(Windows) - 不要依赖
"module"或"file"启动方式自动继承解释器——它不保证加载site-packages - 如果用了多配置(如 pytest + debug),每个
configuration都要单独设python路径,不能只靠全局设置
pip freeze > requirements.txt 是最常见污染源
pip freeze 会把当前环境中**所有**已安装包都列出来,包括 pip、setuptools、wheel,甚至 VSCode Python 插件悄悄装的 debugpy 或 pylsp。这些不是你的项目依赖,却混进 requirements.txt,导致部署时多装无用包、触发权限冲突或版本打架。
实操建议:
- 永远别直接
pip freeze > requirements.txt用于生产环境 - 如果真要用,先过滤掉非项目包:
pip freeze | grep -v "^(pip|setuptools|wheel|debugpy|pylsp)" > requirements.txt - 更稳妥的做法:删掉现有
requirements.txt,用pipreqs或pip-tools重生成
requirements.in 是人控的起点,pip-compile 是机器算的终点,中间任何手动干预(比如直接 pip install package==x.y.z 后再 freeze)都会绕过约束逻辑。一旦跳过编译步骤,就等于放弃锁定。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










