太长不看版
环境变量有问题,查看环境变量,应该会发现,在你虚拟环境的地址之前,有其他的地址,比如/home/xxx/.local/bin:等,而且这个地址里面刚好有pip,python这些程序。
最简单的办法:去把/home/xxx/.local里的bin和lib都删除了。
不想删除的:修改环境变量
vim ~/.profile
把这几行注释了
1. 认识环境变量(PATH)
解决这个问题首先要认识环境变量,环境变量PATH是一个列表,里面是有序的一些程序的地址(一般是xxx/bin),添加环境变量后,系统在任何目录输入命令,都可以识别命令并执行命令对应程序。环境变量的作用就是告诉系统可以去这些地方找。
系统查找的顺序是:当前目录-系统变量列表依次-环境变量列表依次
2.查看系统当前的环境变量
echo $PATH
- 一般安装了anaconda后,登录后就是base环境,查看PATH后,可以发现PATH最开头就是/xxx/anaconda3/bin:/xxx/anaconda3/condabin
- 当你激活你的虚拟环境yourEnv后,再查看PATH,=,可以发现PATH最开头变成/xxx/anaconda3/envs/yourEnv/bin::/xxx/anaconda3/condabin。
- 这也是conda切换环境的原理,就是更改环境变量。
- conda新建环境也简单,就是在envs中新建一个以你自定义的环境名命名的文件夹,然后复制或下载一些基本的包放在里面。
比如我的:
/work/Users/fanxin/anaconda3/bin:/work/Users/fanxin/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/cuda/bin:/opt/pycharm-community-2020.2.3/bin:/snap/bin
为什么是这种顺序呢?在登录Linux系统并启动一个 bash shell 时,默认情况下 bash 会在若干个文件中查找环境变量的设置,这些文件可统称为系统环境文件,登录式shell进入bash时 检查的环境变量文件如下:
账号和密码登录shell——>/etc/profile(全局文件G1)——>/etc/profile.d/(全局脚本目录F1)——> ~/.profile(用户文件U1)——> ~/.bashrc(用户文件U2)——>/etc/bash.bashrc(全局文件G2)
参考文章:【linux】linux环境变量初始化与对应文件的生效顺序
3.解决pip安装的包没放在虚拟环境
3.1问题描述与分析
有时候conda activate虚拟环境后,pip安装包发现说:Requirement already satisfied: 在哪哪文件夹里有,可是并不是在虚拟环境的文件夹。
pip show package_name #查看包的信息,包括安装位置。
pip -V # 查看当前pip的版本,地址
这时查看环境变量,应该会发现,在你虚拟环境的地址之前,有其他的地址,比如/home/xxx/.local/bin:等,比如:
/home/fanxin/.local/bin:/opt/gurobi1000/linux64/bin:/work/Users/fanxin/anaconda3/envs/subdivnet/bin:/work/Users/fanxin/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/cuda/bin:/opt/pycharm-community-2020.2.3/bin:/snap/bin
而且这个地址里面刚好有pip,python这些程序。那么这里面的pip的优先级将高于你虚拟环境里的pip的优先级,因此执行pip安装包时默认启动的不是虚拟环境的pip,就导致了pip安装的包没放在虚拟环境里。
- 为什么会有其他地址在前面呢,这就跟前面说到的环境文件的执行顺序有关了。比如/home/xxx/.local/bin这个地址,就是在执行~/.profile的时候加上去的。
3.2 解决办法
1:最简单的办法,去把/home/xxx/.local里的bin和lib都删除了。
2:修改环境变量文件
比如出现/home/xxx/.local/bin这个地址,那就
vim ~/.profile
把这几行注释了
对于其他异常地址,则需要大家根据环境文件的执行顺序依次检查,把有问题的地方去掉即可
参考文章
anaconda创建新虚拟环境后,pip总是定位到全局Python的pip路径中(无法定位到虚拟环境的pip)