我亲眼目睹了导致此问题的几件事。
第一个是我也安装了 Anaconda。我不得不在 Anaconda 之后移动 pyenv 配置块。这解决了这种情况下的问题。
在第二种情况下,我发现了这个问题,让我想知道如何让它再次工作:
https://github.com/pyenv/pyenv/issues/2026
基本上我的配置文件中有这一行(在我的例子中是 .zshrc,因为我使用的是 ZSH):
eval "$(pyenv init -)"
然后我把它改成了这个,只添加了第一行,它解决了我的问题。
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
这里的 pyenv README 的高级配置部分中有关于此的详细信息:
https://github.com/pyenv/pyenv#advanced-configuration
以下是该部分的副本:
高级配置
除非您必须知道 shell 配置文件中的每一行都在做什么,否则请跳过此部分。
pyenv init 是唯一跨过将额外命令加载到 shell 中的命令。来自 RVM,你们中的一些人可能会反对这个想法。
另请参阅环境变量部分,了解控制 Pyenv 行为的环境变量。
eval "$(pyenv init --path)":
设置您的垫片路径。这是 pyenv 正常运行的唯一要求。您可以通过在 $PATH 中添加 $(pyenv root)/shims 来手动执行此操作。
eval "$(pyenv init --path)" 应该在会话的登录 shell 启动脚本中运行 - 以便会话中的所有进程都可以访问 Pyenv 的功能并且它只运行一次,避免在嵌套 shell 中破坏 PATH (例如,从编辑器/IDE 启动的 shell)。
在 Linux 中,GUI 管理器通常充当 sh 登录 shell,在启动时运行 /etc/profile 和 ~/.profile。 MacOS 的 GUI 不这样做,因此它的终端仿真器应用程序默认将其 shell 作为登录 shell 运行。
eval "$(pyenv init -)":
安装自动补全。这完全是可选的,但非常有用。采购 $(pyenv root)/completions/pyenv.bash 将设置它。 Zsh 用户还有一个 $(pyenv root)/completions/pyenv.zsh。
重新散列垫片。有时您需要重建 shim 文件。在 init 上执行此操作可确保一切都是最新的。您始终可以手动运行 pyenv rehash。
将 pyenv 作为 shell 函数安装到当前 shell 中。该位也是可选的,但允许 pyenv 和插件更改当前 shell 中的变量,从而使 pyenv shell 之类的命令成为可能。 sh 调度程序不会做任何疯狂的事情,比如覆盖 cd 或破解你的 shell 提示符,但如果由于某种原因你需要 pyenv 是一个真正的脚本而不是一个 shell 函数,你可以安全地跳过它。
eval "$(pyenv init -)" 应该在任何交互式 shell 启动时运行(包括嵌套 shell),以便您获得完成和方便的 shell 函数。
要自己了解幕后究竟发生了什么,请运行 pyenv init - 或 pyenv init --path。
如果您不想使用 pyenv init 和 shims,您仍然可以从 pyenv 为您安装 Python 版本的能力中受益。只需运行 pyenv install ,您会发现 $(pyenv root)/versions 中安装了版本,您可以根据需要手动执行或符号链接。