Python: 如何解决“pyenv: bash: command not found”问题

6

我使用 pyenv 来管理我的 Python 环境,当简单运行 bash 时,我会得到以下提示:

$ bash
pyenv: bash: command not found

我试图排除为什么pipenv shell失败并出现上述错误,结果发现即使bash也无法工作。我尝试通过brew更新pipenv并运行pyenv rehash重新生成shims。而bash绝对存在。

$ which bash
/bin/bash

我原本以为如果pyenv找不到一个命令,那么就会搜索PATH环境变量指定的后续路径。有趣的是,如果我执行一些不存在的命令,我并没有收到pyenv错误。

$ someboguscommand
-bash: someboguscommand: command not found

这让我认为,在这种情况下,pyenv甚至不搜索匹配的命令,而是搜索PATH中的后续路径,因此必须对bash进行一些特殊处理。

type bash 会输出什么? - that other guy
$ type bashbash is hashed (/bin/bash) - Greg
2
这表明问题出在您的初始化文件中的某个命令,例如 .bashrc.bash_profile。您可以运行 bash -x 来显示正在发生什么以及它从哪里开始失败的调试跟踪。单独运行 bash 可能会在错误的情况下工作,并且只会在您的 .bashrc.bash_profile 中显示有关失败的 pyenv 命令的警告,同时为您提供一个工作的 shell。 - that other guy
2
更好的建议是使用PS4=':$BASHPID:${BASH_SOURCE##*/}:$LINENO+' bash -x,以记录每个跟踪日志中的进程ID、源文件和行号。将这些日志中的BASHPID与起始shell中的BASHPID进行比较,您就可以得出错误是在进程内还是进程外的确定答案。 - Charles Duffy
1
顺便说一句,冒着从建议漂移到倡导的风险,我个人更喜欢使用Nix来管理开发环境——它不仅可以控制每个shell或项目中哪些Python模块在范围内,还可以控制其他可执行文件和库的版本;这意味着你可以在一个环境中拥有bash 5,在另一个环境中拥有bash 3.2;或者在一个环境中使用针对zlib或sqlite的某个版本构建的Python,在另一个环境中使用不同的版本等等——同样,它支持管理Ruby/Node/Haskell等编译器/解释器/库。 - Charles Duffy
1
我会先查看我的.profile、.bashrc和类似的文件。pyenv的初始化代码在那里,似乎有问题。也许可以删除它,然后重新设置pyenv? - rje
2个回答

8
我在使用Pyenv在CentOS上安装Python 3.8时遇到了问题。当我运行 `pyenv install 3.8.2` 命令时,会出现以下错误:
pyenv: bash: command not found

以下是我是如何解决这个问题的:

问题出在pyenv没有被添加到我的用户profile的加载路径中。

我所需要做的就是执行以下步骤:

打开位于用户主目录下的.bashrc文件:

sudo nano ~/.bashrc

接下来,在文件底部添加以下内容并保存:
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

最后,重新启动终端或运行以下命令,以将新添加的路径加载到您当前的shell / 终端会话中:

exec "$SHELL"

现在当您运行命令pyenv install 3.8.2时,它应该能够正常工作。

资源: 使用pyenv管理多个Python版本

就这些。

希望这有所帮助。


1
问题在于我在.bashrc文件中有以下这行代码,当运行bash时会被调用。这是一行我不再需要的代码:
. virtualenvwrapper.sh

这会调用pyenv的虚拟环境包装器shim:
$ which virtualenvwrapper.sh
/Users/greg/.pyenv/shims/virtualenvwrapper.sh

这就是导致失败的原因。我能够通过使用 bash 运行调试跟踪来识别出这个问题:

$ bash -x
+ . virtualenvwrapper.sh
++ set -e
++ '[' -n '' ']'
++ program=bash
++ [[ bash = \p\y\t\h\o\n* ]]
++ export PYENV_ROOT=/Users/greg/.pyenv
++ PYENV_ROOT=/Users/greg/.pyenv
++ exec /usr/local/Cellar/pyenv/1.2.13_1/libexec/pyenv exec bash
pyenv: bash: command not found

感谢“那个家伙”、“查尔斯·达菲”和“rje”提供的有用评论!谢谢!(保留HTML标签)

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