155

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

先感谢您。

4

22 回答 22

219

[2021 年 7 月]
如果您在运行时看到此消息eval "$(pyenv init -)"

WARNING: `pyenv init -` no longer sets PATH.
Run `pyenv init` to see the necessary changes to make to your configuration.

您应该按照警告的说明检查消息pyenv init,但简而言之,您可以eval "$(pyenv init --path)"改用。

并且不要忘记在必要时相应地更新您的~/.bash_profile, ~/.zprofile,~/.bashrc~/.zshrc

于 2021-07-02T16:31:21.680 回答
162

尝试这个:eval "$(pyenv init -)"

例子:

$ python -V
Python 2.7.9
mac:~ $ eval "$(pyenv init -)"
mac:~ $ python -V
Python 3.5.0

更多信息: https ://github.com/pyenv/pyenv

于 2015-12-08T12:47:07.930 回答
54

对我来说,这在通过 Homebrew 安装后在带有 ZSH 的 MacOS 上工作:

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

我最初eval "$(pyenv init -)"在我的~/.zshrc文件中,但这似乎不起作用。遵循本指南后:https ://github.com/pyenv/pyenv#basic-github-checkout我eval从文件中删除了调用并使用上述命令.zshrc将其添加到文件中,并且在重新启动终端后一切正常。.zprofile

于 2021-08-17T15:23:59.247 回答
54

在 ubuntu 中, ~/.bashrc文件需要更新并更改eval "$(pyenv init -)"eval "$(pyenv init --path)"

于 2021-07-09T12:42:27.373 回答
32

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

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

于 2016-01-21T05:38:50.780 回答
24

这是了解 pyenv 如何在后台工作的绝佳机会。

pyenv global命令只是读取/Users/Soma/.pyenv/version目录中的数据。它与 基本相同cat /Users/Soma/.pyenv/version

pyenv versions命令只是检查层次结构并选择正确的 Python 版本以在运行类似pythonor的“垫片可拦截”命令时使用pip

当您运行时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

您的机器正在目录中找到python可执行文件/usr/bin

您可以将此代码添加到~/.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该命令将由. 该命令将没有机会被拾取,因为它将首先被抓住。python/Users/Soma/.pyenv/shims/usr/bin/python/Users/Soma/.pyenv/shims/python

我明白为什么这个错误会让你感到困惑。除非您知道pyenv 的工作原理,否则很难调试它。

于 2020-04-12T17:04:10.743 回答
14

我在运行 Monterey 并在 Rosetta 仿真终端上安装了 Pyenv 的 Apple M1 MacBook Pro 上遇到了同样的问题。

我的解决方案是将以下内容添加到我的 ~/.zshrc 文件中:

eval "$(pyenv init -)"
eval "$(pyenv init --path)"

我没有向 ~/.zprofile 添加任何内容。

我现在可以看到版本按预期切换。

于 2021-12-10T13:13:44.897 回答
12

背景

  • 现在:20210926
  • 苹果电脑:10.15.7
  • pyenv:2.0.7

解决方案

对于当前控制台
eval "$(pyenv init --path)"
每次开机后工作

如果您想在 Mac 启动后自动生效,请将其添加到您的启动脚本中

这是我的zsh,所以:

vi ~/.zshrc

添加

eval "$(pyenv init --path)"

完毕。

于 2021-09-26T06:48:29.777 回答
7

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) 
于 2021-12-13T22:13:49.933 回答
7

运行pyenv init并完全按照它告诉你的去做。
对我来说,解决方案是将以下内容添加到.profile

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

并将这一行添加到.bashrc

eval "$(pyenv init -)"

不要忘记重新启动你的 shell。(关闭并重新打开或exec "$SHELL"

于 2021-08-16T22:16:23.520 回答
7

仅供参考,如果您的可执行文件被发现早于 pyenv 的 shim 位置,那么当您键入pythonshell 时,您将无法更改 python 版本。

要正确使用 pyenv,shim 目录应该是 PATH 变量中的第一件事。例如,

如果你的 PATH 看起来像

/usr/bin:/home/kenobi/.pyenv/shims:...

如果你有一个 python 可执行文件/usr/bin,你将无法正确使用 pyenv。~/.bashrc你应该像下面这样安排你的 PATH 配置

/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

如您所见,我export PATH=/usr/bin:$PATH在 pyenv 配置行之后。然后我通过切换如下块解决了这个问题

# 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)"
于 2021-07-01T04:34:05.540 回答
6

[ 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)
于 2021-11-17T19:05:37.027 回答
5

Check your PATH. Somehow I have .pyenv/bin, when it should be .pyenv/shims.

Fix the path with export PATH="$HOME/.pyenv/shims:$PATH" (and add to zshrc etc).

于 2021-08-01T04:35:29.957 回答
3

在最初的问题中,我看到MacOSPyenv安装了Homebrew. 因为shell我认为Zsh应该有:

~/.zprofile将以下行归档

eval "$(pyenv init --path)"

~/.zshrc并将以下行归档

eval "$(pyenv init -)"

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

对于其他版本,我建议查看README安装后步骤

于 2021-11-22T11:59:31.360 回答
2

存在无法更新~/.bashrc~/.bash_profile机器共享的情况。在这种情况下,添加eval "$(pyenv init --path)"到 bash 脚本应该仍然有效,因为pyenv init将 pyenv 垫片的路径添加到 $PATH。例如,pyenv 将执行如下命令:

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

希望这能解释它为什么起作用。或者,一个人应该能够/path/to/.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

于 2021-09-24T15:02:23.490 回答
2

此答案仅适用于使用 Fish shell 并找到此线程的人。Pyenv 使用垫片ref,因此为了使 pyenv 与您的鱼壳一起工作,您必须编辑您的 ~/.config/fish/config.fish 文件并在 $PATH 变量的开头附加 pyen 垫片目录。这是我的 config.fish 的样子。

### PATH ###
set default_path /usr/local/bin /usr/bin /usr/sbin /bin /sbin
set macports /opt/local/bin
set androiddev ~/Android\ Development/platform-tools/
set rbenv ~/.rbenv/shims/
set pyenv ~/.pyenv/shims/
set anaconda /Users/m4punk/anaconda/bin/
set pg_config /Applications/Postgres.app/Contents/Versions/9.5/bin/


### Virtual Enviroment Wrapper ###

set -g VIRTUALFISH_HOME ~/Documents/Coding/python/virtualenvs
set -g VIRTUALFISH_DEFAULT_PYTHON /usr/local/bin/python3
eval (python -m virtualfish)

### NVM Settings ###
set -g NVM_DIR ~/.nvm

set -gx PATH $pyenv $default_path $macports $androiddev $rbenv $pg_config

setenv EDITOR sublime

这里的相关行是

set pyenv ~/.pyenv/shims/

set -gx PATH $pyenv $default_path $macports $androiddev $rbenv $pg_config

第一个为 pyenv shim 路径创建一个变量,第二个将它添加到路径变量的前面。只需保存并关闭,重新启动您的终端会话,您就应该一切就绪。

于 2018-08-20T14:40:49.973 回答
1

我遇到了同样的问题,最终对设置 shell的方式进行了一些更改,但最终它的工作方式相同。 与 pyenv github 页面上的指南pyenv init唯一真正的区别是我也必须将目录添加到我的路径中。$(pyenv root)/bin

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

以下是我设置自己的步骤,从高处看:

  1. 运行该pyenv init命令的试运行版本,这样您就可以看到它会为您做什么。
  2. PATH和 shell 环境变量放入您的.bash_profile (或您的发行版使用的任何文件)中。
  3. 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

pyenv init下一位使用我们从上面步骤 1的试运行中复制的新逻辑来更新您的 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
于 2019-03-21T22:28:09.270 回答
1

如果这里的自述文件不起作用: https ://github.com/pyenv/pyenv

仔细检查您是否手动设置了路径。就我而言,我在我的 .zshrc 文件中为旧 python 添加了别名,删除它后效果很好!

于 2021-08-09T11:06:39.253 回答
1

安装正确版本后,关闭所有终端并尝试pyenv global 3.7.2然后尝试python --version,它应该可以工作

于 2021-01-18T07:36:20.613 回答
1

假设您是 MacOS 用户...

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.1pyenv 2.2.0Pyenvbrew一起安装,pythonpyenv install.

于 2021-11-13T13:01:00.337 回答
0

如果你pyenv local在过去的任何时候做过,它会在你的主目录中创建一个新.python_version文件 ~.

如果您的开发环境配置不正确,可能会影响 pyenv 全局命令。

删除此文件,pyenv global应该可以工作。

于 2021-03-19T10:38:42.790 回答
0

以上答案均无效。看来我没有遵循正确的安装过程。我通过执行以下操作来解决它:

  1. 进入 ~/.zshrc
  2. alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew'在文件末尾添加
  3. pyenv init

pyenv 文档中有关此的更多信息

于 2022-01-29T06:41:13.233 回答