我想用pyenv来切换python2和python3。
我成功下载了python2和python3和pyenv下面的代码。
brew install pyenv
brew install pyenv-virtualenv
pyenv install 2.7.10
pyenv install 3.5.0
但是,我不能从python2切换到python3..
Soma-Suzuki:~ Soma$ python --version
Python 2.7.10
Soma-Suzuki:~ Soma$ pyenv global
2.7.10
Soma-Suzuki:~ Soma$ pyenv versions
system
* 2.7.10 (set by /Users/Soma/.pyenv/version)
3.5.0
Soma-Suzuki:~ Soma$ pyenv global 3.5.0
Soma-Suzuki:~ Soma$ pyenv global
3.5.0
Soma-Suzuki:~ Soma$ pyenv versions
system
2.7.10
* 3.5.0 (set by /Users/Soma/.pyenv/version)
Soma-Suzuki:~ Soma$ python --version
Python 2.7.10
Soma-Suzuki:~ Soma$
我不明白为什么会这样。
我的python在这个目录中。
Soma-Suzuki:~ Soma$ which python
/usr/bin/python
仅供参考,如果你的可执行文件早于pyenv的shim位置,那么当你在shell中键入python时,你将无法更改python版本。
要正确使用pyenv, shim目录应该是PATH变量中的第一个内容。例如,
如果你的PATH看起来像
/usr/bin:/home/kenobi/.pyenv/shims:...
如果你在/usr/bin中有一个python可执行文件,你将不能正确使用pyenv。您应该在~/中安排您的PATH配置。Bashrc如下图
/home/kenobi/.pyenv/shims:/usr/bin:...
然后重新启动shell,就不会有问题了。
对我来说,我在~/.zshrc中有这些行
# PyEnv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH" # This line was causing the problem
eval "$(pyenv init --path)"
# Docker
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
正如您所看到的,我在pyenv配置行之后设置了export PATH=/usr/bin:$PATH。然后我通过像下面这样切换块来解决这个问题
# Docker
export PATH=/usr/bin:$PATH # Not a problem anymore.
export DOCKER_HOST=unix:///run/user/1000/docker.sock
# PyEnv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
这是一个了解pyenv工作原理的好机会。
pyenv global命令只是读取/Users/Soma/中的数据。pyenv /版本目录中。基本上和cat /Users/Soma/.pyenv/version一样。
pyenv versions命令只是检查层次结构,并在运行Python或pip等“shim interceptable”命令时选择正确的Python版本。
当您运行pyenv global 3.5.0时,/Users/Soma/。Pyenv /version文件更新为包含“3.5.0”。这是pyenv所做的唯一更改。大多数用户都很惊讶pyenv global 3.5.0只改变了文本文件中的一行!
当你运行python——version时,你的终端将执行与执行任何shell命令时相同的步骤:它遍历PATH中的每个目录并寻找第一个名为python的可执行文件。
如果你输入echo $PATH,你会得到这样的东西:/usr/ local/bin:/usr/bin:/bin:/usr/sbin:/sbin
您的机器在/usr/bin目录中找到python可执行文件。
您可以将此代码添加到~/。bash_profile文件来更改PATH。
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init -)"
fi
重新启动您的终端,再次运行echo $PATH,现在您将看到如下输出:/ Users/Soma/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
注意/Users/Soma/。pyenv/shims目录现在在PATH的开始。当您现在运行python——version时,该命令将由/Users/Soma/.pyenv/shims中的python可执行文件处理。该命令将没有机会被/usr/bin/python捕获,因为它将被/Users/Soma/捕获。pyenv /垫片/ python。
我知道为什么这个虫子让你困惑了。除非您知道pyenv是如何工作的,否则很难进行调试。
仅供参考,如果你的可执行文件早于pyenv的shim位置,那么当你在shell中键入python时,你将无法更改python版本。
要正确使用pyenv, shim目录应该是PATH变量中的第一个内容。例如,
如果你的PATH看起来像
/usr/bin:/home/kenobi/.pyenv/shims:...
如果你在/usr/bin中有一个python可执行文件,你将不能正确使用pyenv。您应该在~/中安排您的PATH配置。Bashrc如下图
/home/kenobi/.pyenv/shims:/usr/bin:...
然后重新启动shell,就不会有问题了。
对我来说,我在~/.zshrc中有这些行
# PyEnv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH" # This line was causing the problem
eval "$(pyenv init --path)"
# Docker
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
正如您所看到的,我在pyenv配置行之后设置了export PATH=/usr/bin:$PATH。然后我通过像下面这样切换块来解决这个问题
# Docker
export PATH=/usr/bin:$PATH # Not a problem anymore.
export DOCKER_HOST=unix:///run/user/1000/docker.sock
# PyEnv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"