我想用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

当前回答

背景

现在:20210926 麦克:10.15.7 pyenv: 2.0.7

解决方案

对于当前控制台

eval "$(pyenv init --path)"

用于每次启动后的工作

如果你想在Mac引导后自动生效,那么把它添加到你的引导脚本中

这里是zsh,所以:

vi ~/.zshrc

add

Eval $(pyenv init——path)

完成了。

其他回答

你忘记添加这个eval "$(pyenv init -)"。

将此添加到您的.bash_profile或.bashrc文件(mac <=10.14)或.zshrc文件(mac 10.15+)

MacOSX 10.15.17

vim ~/.zshrc

添加或更新

eval "$(pyenv init --path)"

然后运行

source  ~/.zshrc

pyenv global 3.7.0

最后运行

python -V
Python 3.7.0 (default, Dec 12 2021, 13:40:24) 

这是一个了解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是如何工作的,否则很难进行调试。

[2021年11月]

这就是用ZSH在Mac OSX上为我修复的问题。Pyenv在解释需要向ZSH配置中添加什么方面做得很差。没有定义$PYENV_ROOT。秩序很重要。

将它添加到~/的顶部。zshrc配置:

export PATH="$HOME/.pyenv/bin:$PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH"
PYENV_ROOT=$(pyenv root)

存在不能更新~/的情况。Bashrc或~/。Bash_profile,因为机器是共享的。在这种情况下,向bash脚本中添加eval "$(pyenv init——path)"仍然可以工作,因为pyenv init将pyenv shims的路径添加到$ path中。例如,pyenv将执行如下命令:

export PATH="/path/to/.pyenv/shims:${PATH}"

希望这能解释为什么它是有效的。或者,可以将/路径/导出到/。Pyenv /shims在他们的bash脚本中,它应该允许Pyenv切换python版本。

我还面临着eval "$(pyenv init -)"确实帮助将python版本切换到3.8.8的情况。但是当我启动一个虚拟环境时,虚拟环境创建中的python版本会失败:

virtualenv "$VENV_PATH" -p 3.8.8

RuntimeError: failed to find interpreter for Builtin discover of python_spec='python3.8.8'

但是通过eval "$(pyenv init——path)",虚拟环境也得到了3.8.8。python的版本。