无法用pyenv切换Python

时间:2015-10-24 17:42:06

标签: python pyenv

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

提前谢谢。

12 个答案:

答案 0 :(得分:50)

试试这个:eval“$(pyenv init - )”

示例:

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

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

答案 1 :(得分:33)

[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~/.zshrc 等。

答案 2 :(得分:11)

您忘记将此eval "$(pyenv init -)"添加到.bash_profile文件中的第一行(如果您使用的是Mac)或.bashrc文件。

答案 3 :(得分:5)

这是一个很好的机会,了解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中的每个目录并查找名为{{1 }}。

如果您输入python,您将看到类似以下内容的内容:echo $PATH

您的计算机正在/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin目录中找到python可执行文件。

您可以将此代码添加到/usr/bin文件中以更改PATH。

~/.bash_profile

重新启动终端,再次运行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抓住。

我知道为什么这个错误使您感到困惑。除非您知道how pyenv works,否则很难调试它。

答案 4 :(得分:1)

此答案仅适用于使用Fish shell并找到此线程的人。 Pyenv使用垫片ref,因此,为了使pyenv与您的鱼壳配合使用,您必须编辑〜/ .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填充路径创建变量,第二个将其添加到path变量的前面。只需保存并关闭,重新启动您的终端会话即可,一切准备就绪。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

之所以这样做,是为了避免运行eval "$(pyenv init -)"导致外壳程序启动时间过长,以及避免其他.bash_profile进入我的本地外壳程序环境的工作。只是为了清楚起见;以我的拙见,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

接下来的部分将使用我们从上述第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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果您在过去的任何时间执行过 pyenv local,它将在您的主目录中创建一个新的 .python_version 文件 ~。

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

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

答案 9 :(得分:0)

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

要正确使用 pyenv,shim 目录应该是 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)"

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

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