我想用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
提前谢谢。
答案 0 :(得分:50)
试试这个:eval“$(pyenv init - )”
示例:
$ python -V
Python 2.7.9
mac:~ $ eval "$(pyenv init -)"
mac:~ $ python -V
Python 3.5.0
答案 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版本,以便在运行诸如python
或pip
之类的“可拦截垫片”命令时使用。
运行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初始化过程可能会变慢。
以下是我从高角度进行设置的步骤:
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
空运行复制的新逻辑中更新外壳程序。
$ 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 添加了别名,删除它后工作正常!