折腾树莓派的时候遇到一个很诡异的问题。使用pyenv安装虚拟环境之后,python -V显示的是正确的虚拟环境python版本,然而which pip却显示的是系统的pip:
$ which python /home/pi/.pyenv/shims/python $ which pip /home/pi/.local/bin/pip
pip list当然也是显示系统python环境安装的各种包。
最诡异的是,最开始虚拟环境的pip是正确指向/home/pi/.pyenv/shims/pip的,从某个时间开始新建的虚拟环境就都不行了。而且出现问题后,随时切换到正常的虚拟环境的pip仍然还是正常的。
于是折腾一通,发现在~/.profile里面写的是:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
确认一下:
$ echo $PATH /home/pi/.local/bin:/home/pi/.pyenv/plugins/pyenv-virtualenv/shims:/home/pi/.pyenv/shims:/home/pi/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
所以$HOME/.local/bin被添加到$PATH最前面,导致$HOME/.local/bin/pip先被找到。
修改~/.profile,把$PATH提到前面。
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$PATH:$HOME/bin"
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$PATH:$HOME/.local/bin"
fi
sudo reoot之后,再次查看$PATH,which pip结果正确:
pi@raspberrypi:~ $ echo $PATH /home/pi/.pyenv/plugins/pyenv-virtualenv/shims:/home/pi/.pyenv/shims:/home/pi/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin pi@raspberrypi:~ $ pyenv activate myenv1 pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior. (myenv1) pi@raspberrypi:~ $ which pip /home/pi/.pyenv/shims/pip
然后 pip list结果就是一个新的基本python环境了:
$ pip list Package Version ---------- ------- pip 22.1.2 setuptools 40.8.0
但是为什么以前是好的呢? 百思不得其解。改了之后问题暂时解决。其他系统也没看到过类似问题。就先这样吧。



