You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pip freeze生成requirements.txt出现系统依赖问题求助

为什么pip freeze会生成带本地路径的依赖而非版本号?

问题背景

我用pip freeze > requirements.txt生成依赖清单时,结果里出现了带本地文件路径的条目(比如asgiref @ file:///xxx),而不是预期的包名==版本号格式。哪怕切换到虚拟环境操作,还是会出现这类本地路径依赖。

当前生成的内容:

asgiref @ file:///Users/cbousseau/work/recipes/ci_py311/asgiref_1677957028708/work
Django @ file:///Users/cbousseau/work/recipes/ci_py311/django_1677970851911/work
djangorestframework==3.15.0
mysqlclient==2.2.4
python-dotenv==1.0.1
sqlparse @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_16ptvrhamb/croot/sqlparse_1690901943673/work

期望的标准格式:

asgiref==3.8.0
Django==4.2
djangorestframework==3.15.0
setuptools==68.2.2
sqlparse==0.4.4
wheel==0.41.2

注:已经试过虚拟环境和全局环境,且用pipreqs能生成符合预期的清单,但想搞清楚默认pip freeze为什么会出现这种情况。

核心原因

出现本地路径的本质是:这些包不是从PyPI官方仓库下载安装的,而是通过本地目录、临时构建缓存或者CI环境的本地构建文件安装的。

pip会记录每个包的安装来源,当来源不是PyPI上的标准版本包时,就会输出@ file://格式的引用,而不是简洁的==版本号。比如你看到的路径,大概率是在CI环境中从源码构建安装Django、asgiref等包,或者本地用pip install .(直接安装本地项目目录)的方式装的。

虚拟环境也中招的原因

虚拟环境只是隔离了系统全局的包,但如果在虚拟环境里安装的包本身就是本地构建版本,pip依然会如实记录它的安装来源,和虚拟环境的隔离性无关。

用pip freeze生成标准版本号清单的办法

如果想让pip freeze输出纯版本号格式,有两个可行方案:

  • 重新从PyPI安装对应版本:先卸载本地安装的包,再用pip install django==4.2这种明确指定版本的命令从PyPI重新安装,之后pip freeze就会输出==格式的条目;
  • 排除可编辑安装的包:如果包是用pip install -e .(可编辑模式)安装的,用pip freeze --exclude-editable可以过滤这类包,但如果是本地非可编辑安装的包,这个参数没用,还是得重新从PyPI安装。

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:35:18