折腾树莓派的时候遇到一个很诡异的问题。使用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
但是为什么以前是好的呢? 百思不得其解。改了之后问题暂时解决。其他系统也没看到过类似问题。就先这样吧。