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

当前回答

存在不能更新~/的情况。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的版本。

其他回答

假设你是MacOS用户……

Run

pyenv init

要得到这个建议:

# See the README for instructions on how to set up
# your shell environment for Pyenv.

所以,去https://github.com/pyenv/pyenv#readme获取这个小贴士吧:

Zsh: MacOS,如果Pyenv安装了Homebrew:

echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
 
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

确保你的终端 应用程序将shell作为登录shell运行。

适用于macOS Monterey 12.0.1和pyenv 2.2.0。 Pyenv通过brew安装,python通过Pyenv install安装。

仅供参考,如果你的可执行文件早于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 init设置shell的方式进行了一些更改,但最终它的工作原理是一样的。与pyenv github页面上的指南唯一真正的区别是,我必须将$(pyenv root)/bin目录也添加到我的路径中。

我这样做的原因是为了避免运行eval "$(pyenv init -)"和所有其他进入本地shell环境的.bash_profile工作所需的长时间shell启动时间。明确一点;在我看来,Pyenv本身并没有带来糟糕的shell体验,但是当您使用几种语言时,它们都有自己的版本管理系统和工具,并且喜欢使用Pyenv等从.profile进行初始化,shell初始化过程可能会变得很慢。

下面是我从高处观察自己的步骤:

运行pyenv init命令的干运行版本,这样您就可以看到 对你有什么好处。 将PATH和shell环境变量放到.bash_profile中 (或者你的发行版使用的任何文件)。 将pyenv init函数打印到你的.bashrc并源你的.bashrc 从您的.bash_profile

这是完成它的一种方法,但最好将其作为“伪代码”使用。你应该把.bash_profile换成你的发行版喜欢的任何文件。

$ pyenv init - # use the output for reference, it doesn't actually do anything
$ cat <<EOBP > ~/.bash_profile
export PYENV_SHELL=bash
PATH=$(pyenv root)/shims:$(pyenv root)/bin:$PATH
[ -f  /usr/local/Cellar/pyenv/1.2.9/completions/pyenv.bash ] && . /usr/local/Cellar/pyenv/1.2.9/completions/pyenv.bash
[ -f ~/.bashrc ] && . ~/.bashrc
EOBP

下一部分使用我们从上面第1步的pyenv init演练中复制的新逻辑更新shell。

$ cat <<EORC > ~/.bashrc
# from $(pyenv init -)
pyenv() {
    local command
    command="${1:-}"
    if [ "$#" -gt 0 ]; then
        shift
    fi

    case "$command" in
    rehash|shell)
        eval "$(pyenv "sh-$command" "$@")";;
    *)
        command pyenv "$command" "$@";;
    esac
}
EORC

背景

现在:20210926 麦克:10.15.7 pyenv: 2.0.7

解决方案

对于当前控制台

eval "$(pyenv init --path)"

用于每次启动后的工作

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

这里是zsh,所以:

vi ~/.zshrc

add

Eval $(pyenv init——path)

完成了。

运行pyenv init并严格执行它告诉您的操作。 对我来说,解决方案是在.profile中添加以下内容:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

并将这一行添加到.bashrc:

eval "$(pyenv init -)"

不要忘记重新启动您的shell。(关闭并重新打开或执行“$SHELL”)