使用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
相关产品推荐
相关产品推荐

