通过pyenv安装的解释器未添加到$PATH路径中。

21

我无法理解为什么通过homebrew安装的pyenv似乎无法正常工作。

看起来我的$PATH变量没有被pyenv正确更新,因此通过pyenv安装的任何解释器都找不到。例如,对于Python 3.6.8版本:

$ pyenv versions
  system
* 3.4.10 (set by /Users/cglacet/.pyenv/version)
* 3.5.7 (set by /Users/cglacet/.pyenv/version)
* 3.6.8 (set by /Users/cglacet/.pyenv/version)
* 3.7.3 (set by /Users/cglacet/.pyenv/version)
* 3.8-dev (set by /Users/cglacet/.pyenv/version)

$ pyenv which python3.6
/Users/cglacet/.pyenv/versions/3.6.8/bin/python3.6

$ $(pyenv which python3.6) --version
Python 3.6.8

$ pyenv shell
pyenv: no shell-specific version configured

$ pyenv local
pyenv: no local version configured for this directory

到目前为止,一切看起来都很好,但是:

$ python3.6 --version
-bash: python3.6: command not found

$ python --version
Python 3.7.0

如果我检查我的 PATH 环境变量,我看不到任何形式为 /Users/cglacet/.pyenv/versions/3.x.x/bin 的路径。

请注意,在安装 pyenv(系统版本)之前,3.7.0 是我拥有的 Python 版本。我期望的是可以使用 3.6(通过 pyenv 安装的所有版本)作为全局解释器,这应该是可以实现的,就像之前展示的那样。预期的行为是:

$ python3.6 --version
Python 3.6.8

预期的功能是什么?请添加它。 - Mithilesh_Kunal
不确定,但我认为 /usr/local/bin - cglacet
1
没有迹象表明您已执行 pyenv init 或按照说明进行设置。由于您没有提供 MCVE,我们无法告诉您安装出了什么问题。"我会在我对发生的事情有一个模糊的想法时立即更新标题。" SO 不是个人帮助网站,它是一个文档网站。这是您在发布之前需要完成的事情。 - jpmc26
1
@cglacet 很不可能在一个问题中捕获所有可能导致此错误的原因。主机系统的任何更改或安装过程中的错误都可能导致此错误。这里没有足够的信息让回答者确定他们对原因的信念是否正确。我的观点是,由于这个原因,这不是一个好问题。 - jpmc26
@cglacet 请使用 @ 语法回复,否则对方将不会收到通知。听起来你不太熟悉 Linux 系统的工作方式。bashrc 是一个脚本,在用户启动新的 bash 实例时自动执行。.bash_profile 和 .profile 是类似但并不完全相同的。 (它们在不同的条件下被调用。)没有像 Windows 中那样的全局环境变量注册表。查看如何使环境变量更改永久化以获取更多详细信息。 - jpmc26
显示剩余6条评论
2个回答

33

经过一番搜索,我发现Homebrew安装失败并没有修改我的.bash_profile文件。问题是pyenv本身不依赖这些内容,因此这个错误是静默的(你的路径中没有解释器)。

如果你遇到了这种情况,你需要手动运行部分安装步骤(从“#2 Configure your shell's environment for Pyenv”开始),并在你的~/.bash_profile中添加以下内容(最好将这个新路径附加到已有路径之前,也就是将其追加到你的bash profile的末尾):

export PATH=$(pyenv root)/shims:$PATH

这解决了我遇到的问题(因为目录$(pyenv root)/shims包含通过pyenv安装的所有解释器)。但是您可能希望拥有pyenv提供的完整功能集(例如命令的自动完成),理论上可以通过将以下内容添加到您的.bash_profile中而不是导出PATH来实现:

eval "$(pyenv init -)"

但是对于我来说,这并没有起作用,因为pyenv init生成了一些有缺陷的代码(缺少function声明),另一方面,您可以使用以下代码,它应该有效(更好):

eval "$(pyenv init - | sed 's:^pyenv() :function pyenv():')"

我仍然不知道为什么在我的系统上安装失败,如果有人知道,那将是有趣的(并且这可能值得修复,因为我可能不是唯一遇到这个问题的人)。


谢谢!同样的问题!我的Python版本在环境中指向了本地机器上的Python,只需一行<export PATH=$(pyenv root)/shims:$PATH>,我就能解决它了。 - Reihan_amn
你也在使用OSX吗? - cglacet
@cglacet 我在OSX 10.15.4上也遇到了同样的问题。谢谢 - WebOrCode
谢谢,这非常有帮助!对于fish shell,请将“set PATH(eval pyenv root)/ shims $ PATH”添加到config.fish中。 - Andreas Kraft
这并没有解决.pyenv/versions/3.6.8/bin/中项目路径的问题。它只是为主要的 shims(pip python python3 等)修复了路径。我假设有一个类似的命令可以返回当前选定版本的路径,类似于(pyenv root),因此也将$(pyenv version?)/bin或其他内容添加到路径中。编辑:运行"pyenv rehash"通过创建versions/3.x/bin文件夹中所有内容的shim来解决该问题。当您通过shim安装软件包时,它应该自动运行,但似乎无法正常工作。 - JReader

2

pyenv已经将路径前缀分解为一个单独的init命令。在您的dotfiles中,您需要添加一个额外的pyenv init --path:

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

如果您手动运行此命令(不要执行它),请检查它的功能:
$ pyenv init --path
export PATH="/Users/yourname/.pyenv/shims:${PATH}"

为什么文档中没有提到这个?https://github.com/pyenv/pyenv#set-up-your-shell-environment-for-pyenv - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接