【问题标题】:Cannot switch Python with pyenv无法使用 pyenv 切换 Python
【发布时间】:2016-01-24 02:38:19
【问题描述】:

我想用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 文件。制作别名 python=Python3.5.0
  • @AnakinTung 因此完全破坏了适当的版本控制。

标签: python pyenv


【解决方案1】:

[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 等。

【讨论】:

  • 谢谢!在 ubuntu 中需要更新不同的文件bashrc
  • 这解决了我在 Mac OS Catalina 上的问题。我没有收到那个警告,尽管我的.zshrc 中有eval "$(pyenv init -)",但我的 Python 版本没有更新。谢谢!
  • 我没有收到警告,也没有收到我教的班上的任何人,但非常令人沮丧......我很高兴我从未看到有关此更改的提示。
  • 对于 macOS Big Sur(通过 brew 安装),我需要(以及我现有的 .zshrc 中的 eval "$(pyenv init -)")将以下内容添加到 .zprofileeval "$(pyenv init --path)"
  • 在 Big Sur 上解决了它......非常感谢 :)
【解决方案2】:

试试这个: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

【讨论】:

  • 根据给定的文档,将eval "$(pyenv init -)" 放在.bash_profile 的末尾。请注意,对我来说,将它放在.bashrc 中并没有 起作用。 (如果使用 .bashrc,文档会警告“奇怪”行为。)
  • 运行eval "$(pyenv init -)" 不会改变我的python -V,即使我确实在~/.pyenv 中安装了pyenv 版本
  • 我在.zshrc 中缺少export PATH="$PYENV_ROOT/shims:$PATH",除了我配置的export PATH="$PYENV_ROOT/bin:$PATH"
  • 正如 Vadorequest 所说,如果使用自制软件安装 pyenv,则必须将 $PYENV_ROOT/shims 添加到路径中,因为 $PYENV_ROOT/bin 不存在。我认为这是 pyenv 的自制安装所独有的。
  • 不知道为什么,但在我的系统上从未定义过 $PYENV_ROOT;将export PATH="$(pyenv root)/shims:$PATH" 添加到我的 .zshrc 文件中。
【解决方案3】:

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

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

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

【讨论】:

  • 在我的情况下,这没有 ~/.zprofile 文件,而且 ~/.zshrc 根本没有提到 pyenv,所以我只运行了 echo 'eval "$(pyenv init --path)"' >> ~/.zshrc 并且它起作用了。
  • eval "$(pyenv init --path)" in ~/.zshrc 可能是根本原因。
【解决方案4】:

您忘记添加此eval "$(pyenv init -)"

将此添加到您的 .bash_profile 或 .bashrc 文件 (mac

【讨论】:

  • 根据文档,它应该在文件末尾
  • @Jonathan 没有什么不同
  • 在终端输入pyenv init,看看是否有一些必要的改变。
【解决方案5】:

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

【讨论】:

  • 这也是我在 MacO 上的解决方案。谢谢。
【解决方案6】:

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

pyenv global 命令只是读取/Users/Soma/.pyenv/version 目录中的数据。和cat /Users/Soma/.pyenv/version基本一样。

pyenv versions 命令只是 checking through the hierarchy 并选择正确的 Python 版本,以便在运行“可拦截垫片”命令(如 pythonpip)时使用。

当您运行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/shims/python 获取。

我明白为什么这个错误会让你感到困惑。除非你知道how pyenv works,否则很难调试。

【讨论】:

    【解决方案7】:

    背景

    • 现在:20210926
    • 苹果机:10.15.7
    • pyenv:2.0.7

    解决方案

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

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

    这里是 zsh,所以:

    vi ~/.zshrc
    

    添加

    eval "$(pyenv init --path)"

    完成。

    【讨论】:

    • 所以这在 Ubuntu 上对我有用,方法是将它添加到我的 bashrc 文件中——修复了 pyenv 全局命令,但我在 pyenv 文档中的任何地方都看不到添加该行:eval "$(pyenv init --path) ?还是我错过了?那条线实际上是做什么的?
    • 这也适用于 WSL2 Arch。原始的 pyenv 安装将 $(pyenv init -) 添加到 ~/.zshrc 这对我不起作用。
    【解决方案8】:

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

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

    如果你的 PATH 看起来像

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

    如果您在/usr/bin 中有一个python 可执行文件,您将无法正确使用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
    

    如您所见,我在 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)"
    

    【讨论】:

    • 对我来说,问题是一个包安装了另一个 python 版本作为依赖项并搞砸了我的 pyenv。这样做可以确保同样的问题不会再次影响到我。
    【解决方案9】:

    运行 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"

    【讨论】:

      【解决方案10】:

      检查您的PATH。不知怎的,我有.pyenv/bin,它应该是.pyenv/shims

      使用export PATH="$HOME/.pyenv/shims:$PATH" 修复路径(并添加到zshrc 等)。

      【讨论】:

      • 以防万一:检查您的路径:$ echo $PATH
      【解决方案11】:

      [2021 年 11 月]

      这就是我在使用 ZSH 的 Mac OSX 上解决问题的原因。 pyenv 在解释需要添加到 zsh 配置中的内容方面做得不好。 $PYENV_ROOT 未定义。顺序很重要。

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

      【讨论】:

      • 这适用于我在 Windows 10 上运行的 Ubuntu LTS 20.04 上的 zsh。
      • 是的,这也是我需要的额外位。谢谢@ianSmith!
      【解决方案12】:

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

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

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

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

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

      【讨论】:

        【解决方案13】:

        此答案仅适用于使用 Fish shell 并找到此线程的人。 Pyenv 使用 shims,ref,所以为了使 pyenv 与您的 fish shell 一起工作,您必须编辑您的 ~/.config/fish/config.fish 文件,并在 $PATH 变量的开头附加 pyen shim 目录。这是我的 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 路径创建一个变量,第二个将它添加到路径变量的前面。只需保存并关闭,重新启动您的终端会话,您就应该一切就绪。

        【讨论】:

          【解决方案14】:

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

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

          希望这能解释它为什么起作用。或者,应该能够在他们的 bash 脚本中导出 /path/to/.pyenv/shims,它应该启用 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 的版本。

          【讨论】:

            【解决方案15】:

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

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

            下一位更新您的 shell,其中包含我们从上面第 1 步的 pyenv init 试运行中复制的新逻辑。

            $ 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
            

            【讨论】:

              【解决方案16】:

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

              【讨论】:

                【解决方案17】:

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

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

                【讨论】:

                  【解决方案18】:

                  在最初的问题中,我看到MacOSPyenvHomebrew 一起安装。对于shell,我假设是Zsh,所以应该有:

                  进入文件~/.zprofile下面这一行

                  eval "$(pyenv init --path)"
                  

                  然后进入文件~/.zshrc以下行

                  eval "$(pyenv init -)"
                  

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

                  对于其他版本,我建议查看READMEpost-installation steps

                  【讨论】:

                    【解决方案19】:

                    MacOSX 10.15.17

                    vim ~/.zshrc
                    

                    添加或更新

                    eval "$(pyenv init --path)"
                    

                    然后运行

                    source  ~/.zshrc
                    
                    pyenv global 3.7.0
                    

                    终于跑了

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

                    【讨论】:

                      【解决方案20】:

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

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

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

                      【讨论】:

                        【解决方案21】:

                        假设您是 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
                        

                        确保您的终端 app 将 shell 作为登录 shell 运行。

                        适用于 ma​​cOS Monterey 12.0.1pyenv 2.2.0Pyenv 安装了 brewpython 安装了 pyenv install

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2021-05-05
                          • 2020-06-13
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-01-16
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-04-21
                          相关资源
                          最近更新 更多