无法使用Pyenv切换Python

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

先谢谢你了。

146715 次浏览

试试这个:__abc0

示例:

$ 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_配置文件或.bashrc文件(Mac<;=10.14)或您的.zshrc文件(Mac 10.15+)

这个答案只适用于正在使用鱼壳并找到这个线程的人。pyenv使用shim__abc0,因此为了让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路径创建一个变量,第二个将其添加到PATH变量的前面。只需保存&;关闭,重新启动您的终端会话,您应该都设置好了。

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

我这样做的原因是为了避免在本地shell环境中运行eval "$(pyenv init -)"和所有其他.bash_profile时需要很长的shell启动时间。只是为了弄清楚。依我愚见,PyEnv本身并没有产生糟糕的shell体验,但是当您使用几种语言时,这些语言都有自己的版本管理系统和工具,这些系统和工具喜欢从.profilepyenv等进行初始化,shell初始化过程可能会很慢。

以下是我在高视野中建立自己的步骤:

  1. 运行__abc0命令的预演版本,您可以看到 它会为你做什么。
  2. 将__abc0和shell环境变量放到__abc1中。 (或者你的发行版使用的任何文件)。
  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

这是一个很好的机会来了解Pyenv如何在引擎盖下工作。

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

__abc0命令只是__abc3,并在运行“ shim interceptable ”命令(如__abc1或__abc2)时选择要使用的正确Python版本。

运行pyenv global 3.5.0时,/Users/Soma/.pyenv/version文件将更新为包含“ 3.5.0 ”。这是派恩夫做出的唯一改变。大多数用户对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文件中以更改路径。

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抓取。

我知道为什么这只虫子让你困惑了。除非您知道Pyenv的工作原理,否则很难对此进行调试。

安装正确的版本后,关闭所有终端并尝试Pyenv Global 3.7.2,然后尝试Python--版本,它应该可以工作

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

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

删除此文件和pyenv global应该工作。

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

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

如果你的道路看起来像

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

如果您有一个__为abc0的Python可执行文件,您将无法正确使用pyenv.您应该在~/.bashrc中安排路径配置,如下所示

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

然后重新启动你的外壳,你会没事的。 对我来说,我在我的~/.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配置行之后有__abc0。然后我通过像下面这样切换块来解决这个问题。

# 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年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文件,并将eval "$(pyenv init -)"更改为eval "$(pyenv init --path)"

编辑:只是指出更改将在重新启动终端后生效。如果您不想重新启动终端,您还可以执行额外的步骤,此外来更改文件。在终端中,执行您在文件中更改的相同命令:__abc0

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

使用__abc0修复路径(并添加到zshrc等)。

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

仔细检查之前是否手动设置了路径。在我的例子中,我在我的.zshrc文件中将别名添加到旧的Python中,删除后它工作正常!

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

对我来说,在通过自制软件安装后,这在带有zsh的MacOS上是可行的:

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

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

因为机器是共享的,所以存在不能更新~/.bashrc~/.bash_profile的情况。在这种情况下,将__abc2添加到bash脚本应该仍然有效,因为__abc3将pyenv shims的路径添加到$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的版本。

背景

  • 现在:20210926
  • MAC:10.15.7
  • PYENV:2.0.7

解决方案

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

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

这里my是zsh,所以:

vi ~/.zshrc

eval "$(pyenv init --path)"

完成了。

假设你是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:

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

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

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

我使用MacOS Monterey 12.0.1PyEnv 2.2.0PYENV安装有酿造蟒蛇安装有pyenv install

[2021年11月]

这就是我在MacOSX上用zsh解决这个问题的方法。Pyenv在解释需要添加到zsh配置中的内容方面做得很糟糕。未定义$PYENV_根。秩序很重要。

将以下内容添加到~/.zshrc配置的顶部附近:

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

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

到文件~/.zprofile中的以下行

eval "$(pyenv init --path)"

并将以下行转换为文件~/.zshrc

eval "$(pyenv init -)"

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

对于其他版本,我建议查看自述文件安装后步骤

我在运行Monterey的苹果M1 MacBook Pro上遇到了同样的问题,在Rosetta仿真终端上安装了Pyenv.

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

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

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

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

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)

上面的答案都不起作用。看起来我没有遵循正确的安装过程。我通过执行以下操作来解决这个问题:

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

有关详细信息,请参阅Pyenv文件

我用BREW安装了Pyenv和Pyenv-VirtualEnv,也遇到了同样的问题。

在你清楚地知道要做什么之后,这很容易解决:

1-您需要知道您使用的是什么shell解释器。直接引用https://support.apple.com/en-us/ht208050

默认情况

下,Mac使用zsh或bash作为命令行 登录shell和交互shell的解释器:

  • Zsh(Z shell)是所有新创建的用户帐户的默认shell,从MacOS Catalina开始。
  • Bash是MacOS Mojave及更早版本中的默认shell.

当然,每个解释器使用不同的文件作为环境变量,如PATH、Java_HOME等。
bash使用的是$HOME/.bash_配置文件和$HOME/.bashrc,而zsh使用的是$HOme/.zprofile和$HOme/.zshrc

2-安装pyenv并安装您想要使用的Python版本(例如pyenv install 3.y)后,打开/.bash_配置文件或/.zprofile文件w R t您的解释器。

注1:,我使用的是bash解释器,我的$HOME/.bashrc文件是空的。因此,我不知道/.bashrc中的任何路径声明是否会影响/.bash_配置文件声明。你可能需要检查一下这个。

3-pyenv创建$HOME/.pyenv/shims目录,并使用它来切换您安装的Python版本。

因此,您只需将下面一行添加到文件的底部(不一定要添加到文件的最底部)。您只需转到所有路径声明的末尾。)

export PATH=$HOME/.pyenv/shims:$PATH

注2:$HOME/.pyenv/shims";必须位于PATH变量的开头。因为所有的路径都是由解释器从左到右读取的。因此,以后向PATH变量添加新路径时要小心。

__abc0,有两个命令可以设置Python版本。一个是";pyenv全局#Python_版本_在这里#";另一个是";pyenv本地#Python_版本_在这里#";。在目录下,按层次结构";本地";命令位于";全局";的顶部一。因此,如果您运行";本地";命令,则不能使用";global";更改全局Python版本。命令指挥。在这种情况下,要么
1-您可以继续使用";本地";$HOME目录
下的命令 2-删除$HOME/.python-version文件并返回";全局";设置

下面是我的shell输出,用于显示此层次结构:

Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv global system
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv versions
* system (set by /Users/ozgurcengelli/.pyenv/version) #look the path
3.6.15
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv local system
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv versions
* system (set by /Users/ozgurcengelli/.python-version) #look the path
3.6.15
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv global 3.6.15
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv versions
* system (set by /Users/ozgurcengelli/.python-version) #look the path
3.6.15
Ozgurs-MacBook-Pro:~ ozgurcengelli$ rm $HOME/.python-version
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv versions
system
* 3.6.15 (set by /Users/ozgurcengelli/.pyenv/version) #look the path

这对我来说是一个永恒的问题,这些答案都不起作用。我发现当我检查pyenv版本时,它会说:

Python 3.9.6(version set by PYENV_VERSION environment variable)

我只需取消设置环境变量,就可以解决这个问题。

在Mac OS上的终端中运行eval "$(pyenv init -)"(注意引号),将pyenv shims目录添加到PATH.然后再次运行pyenv global 3.5.0,并用python3 --version进行检查。