WSL Ubuntu下Python虚拟环境requirements.txt安装异常问题
pip install -r requirements.txt不生效的问题排查与解决 问题描述
在WSL的Ubuntu 22.04环境中,通过pyenv安装Python 3.7.17后,执行以下命令成功创建虚拟环境:
$HOME/.pyenv/versions/3.7.17/bin/python -m venv $HOME/virtualenv/websites/web/myproject
激活虚拟环境后,执行$HOME/virtualenv/websites/web/myproject/bin/python3 -m pip list仅显示pip和setuptools。
但执行$HOME/virtualenv/websites/web/myproject/bin/python3 -m pip install -r ./my/github/repo/requirements.txt时,终端提示"依赖已安装",但再次执行pip list看不到对应包,全局环境也未安装这些依赖。奇怪的是,直接执行$HOME/virtualenv/websites/web/myproject/bin/python3 -m pip install requests==2.xx.x能成功安装并在pip list中显示。
补充信息:
- requirements.txt包含Django2.2、requests2.10等常规依赖
- 执行
pip install -r时输出示例:Requirements already satisfied: Django==2.2 in ./lib/python3.7/site-packages (from -r ./mygithub/repo/requirements.txt) - 直接执行
pip install package==x.y可正常安装并生效,但通过pip install -r requirements无任何安装操作
问题原因
从提示的路径./lib/python3.7/site-packages可以判断:pip解析requirements.txt时,错误使用了相对路径,指向的是当前执行命令所在目录下的lib文件夹(大概率是克隆的仓库本地目录),而非虚拟环境的site-packages目录,因此误判依赖已存在。
解决步骤
使用绝对路径指定requirements.txt
避免相对路径解析错误,直接用绝对路径执行安装命令:$HOME/virtualenv/websites/web/myproject/bin/python3 -m pip install -r $HOME/my/github/repo/requirements.txt强制重新安装依赖
如果路径问题仍存在,添加--force-reinstall参数强制覆盖错误判断:$HOME/virtualenv/websites/web/myproject/bin/python3 -m pip install --force-reinstall -r $HOME/my/github/repo/requirements.txt验证虚拟环境激活状态
激活虚拟环境后,执行以下命令确认pip属于当前虚拟环境:which pip正常输出应为
$HOME/virtualenv/websites/web/myproject/bin/pip,若不是则重新激活虚拟环境:source $HOME/virtualenv/websites/web/myproject/bin/activate激活后直接执行
pip install -r /path/to/requirements.txt即可,无需再写完整路径。检查requirements.txt内容
打开requirements.txt,确认没有./lib/python3.7/site-packages这类本地相对路径依赖,所有依赖均为标准的包名==版本号格式。
内容的提问来源于stack exchange,提问作者manuersuper

