pip freeze > requirements.txt 不行,因其导出的是当前环境所有已安装包(含传递依赖、开发工具、基础包等),而非项目实际直接依赖;应优先使用 pipreqs ./ --force 基于 import 语句生成纯净依赖清单,并手动补全动态导入项。

直接用 pip freeze > requirements.txt 就行,但必须确认当前环境是你想导出的那个——否则导出来的可能是全局环境或别的虚拟环境的包,后续复现会出错。
为什么 pip freeze 导出的包比项目实际用的多
pip freeze 是「环境快照」,不是「项目依赖分析」。它会列出当前 Python 解释器下所有已安装的包,包括:
- 你手动装的包(如
requests) - 这些包的传递依赖(如
urllib3、idna) - 虚拟环境自带的基础包(如
pip、setuptools、wheel),默认也会出现
如果你没用虚拟环境,还可能混入 IDE 插件、临时测试装的包,甚至系统级 Python 工具。所以导出前务必先激活目标虚拟环境。
怎么确保导出的是正确环境的清单
关键动作是「确认解释器归属」,而不是只看终端路径或 PyCharm 界面显示:
- 执行
which python(macOS/Linux)或where python(Windows),看路径是否指向你的虚拟环境(如./venv/bin/python或.\venv\Scripts\python.exe) - 运行
python -c "import sys; print(sys.prefix)",输出路径应与虚拟环境根目录一致 - PyCharm 中:Settings → Project → Python Interpreter,右下角显示的路径必须和上面一致;如果点开 Terminal 后没自动激活,得手动运行
source venv/bin/activate或venv\Scripts\activate
要不要过滤掉 pip、setuptools 这类包
要,除非你明确需要重建完全一致的环境(比如 CI 构建缓存)。生产部署或团队协作时,通常不需要它们出现在 requirements.txt 中:
- Linux/macOS:
pip freeze | grep -v "^\(pip\|setuptools\|wheel\)$" > requirements.txt - Windows PowerShell:
pip freeze | Select-String -Pattern "^(pip|setuptools|wheel)$" -NotMatch > requirements.txt - 更稳妥的做法:导出后手动删掉这三行,或用
pip freeze --all(它反而会强制包含这三项,不推荐)
注意:pipreqs 不走这个路子——它静态分析 .py 文件 import 语句,不依赖当前环境安装状态,适合杂乱环境下的项目精简依赖,但无法识别动态导入(如 importlib.import_module)或条件导入。
真正容易被忽略的是:导出命令本身不校验包是否可安装。比如某包来自私有源、用了 -e . 可编辑安装、或包含本地路径,pip freeze 仍会照常写进 requirements.txt,但换环境后 pip install -r 会直接失败。


















