无法用pyenv切换Python

Som*_*uki 32 python pyenv

我想用pyenv来切换python2和python3.

我用以下代码成功下载了python2和python3以及pyenv.

brew install pyenv

brew install pyenv-virtualenv

pyenv install 2.7.10

pyenv install 3.5.0
Run Code Online (Sandbox Code Playgroud)

但是,我无法从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$ 
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样.

供您参考.我的python在这个目录中.

Soma-Suzuki:~ Soma$ which python
/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

先感谢您.

小智 62

试试这个:eval"$(pyenv init - )"

例:

$ python -V
Python 2.7.9
mac:~ $ eval "$(pyenv init -)"
mac:~ $ python -V
Python 3.5.0
Run Code Online (Sandbox Code Playgroud)

更多信息:https: //github.com/yyuu/pyenv

  • 不知道为什么,但在我的系统上 $PYENV_ROOT 从未定义过;将 `export PATH="$(pyenv root)/shims:$PATH"` 添加到我的 .zshrc 文件中是有效的。 (29认同)
  • 除了我配置的 `export PATH="$PYENV_ROOT/bin:$PATH"` 之外,我还缺少 `.zshrc` 中的 `export PATH="$PYENV_ROOT/shims:$PATH"` (24认同)
  • 根据给出的文档,将 `eval "$(pyenv init -)"` 放在 `.bash_profile` 的末尾。请注意,对我来说,将它放在`.bashrc` 中并没有* 工作。(如果使用`.bashrc`,文档会警告“奇怪”的行为。) (7认同)
  • 在我的情况下,运行 `eval "$(pyenv init -)"` 不会改变 `python -V`,即使我确实在 `~/.pyenv` 中安装了 pyenv 版本 (7认同)
  • 正如 Vadorequest 所说,如果 pyenv 是使用自制软件安装的,则必须将 $PYENV_ROOT/shims 添加到路径中,因为 $PYENV_ROOT/bin 不存在。我认为这是 pyenv 的自制安装所独有的。 (2认同)
  • 不幸的是,这些都不适合我 (2认同)

unt*_*air 59

[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.
Run Code Online (Sandbox Code Playgroud)

您应该pyenv init按照警告的说明检查消息,但简而言之,您可以eval "$(pyenv init --path)"改用。

如有必要~/.bash_profile,请不要忘记相应地更新您的,~/.zshrc或类似内容。

  • 对于macOS Big Sur(通过brew安装),我需要(以及`.zshrc`中现有的`eval "$(pyenv init -)"`)将以下内容添加到`.zprofile`:`eval "$( pyenv init --path)"`. (8认同)
  • 这解决了我在 Mac OS Catalina 上的问题。我没有收到那个警告,尽管我的 `.zshrc` 中有 `eval "$(pyenv init -)"`,我的 Python 版本也没有更新。谢谢! (6认同)
  • 我没有收到警告,我所教的班级中的任何人也没有收到警告,但非常令人沮丧......我很不高兴我从未看到有关此更改的提示。 (2认同)

小智 23

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

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

eval "$(pyenv init -)"
eval "$(pyenv init --path)"
Run Code Online (Sandbox Code Playgroud)

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

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


小智 22

MacOSX 10.15.17

vim ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

添加或更新

eval "$(pyenv init --path)"
Run Code Online (Sandbox Code Playgroud)

然后运行

source  ~/.zshrc

pyenv global 3.7.0
Run Code Online (Sandbox Code Playgroud)

终于跑了

python -V
Python 3.7.0 (default, Dec 12 2021, 13:40:24) 
Run Code Online (Sandbox Code Playgroud)


小智 14

您忘了将此添加eval "$(pyenv init -)"到.bash_profile文件中的第一行(如果您使用的是Mac)或.bashrc文件.


cri*_*fan 13

背景

  • 现在:20210926
  • 苹果:10.15.7
  • pyenv:2.0.7

解决方案

对于当前控制台
eval "$(pyenv init --path)"
Run Code Online (Sandbox Code Playgroud)
每次启动后工作

如果你想在Mac启动后自动生效,那么将其添加到你的启动脚本中

这里我的是 zsh,所以:

vi ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

添加

eval "$(pyenv init --path)"

完毕。


Pow*_*ers 10

这是了解 pyenv 底层工作原理的绝佳机会。

pyenv global命令只是读取/Users/Soma/.pyenv/version目录中的数据。它与cat /Users/Soma/.pyenv/version.

pyenv versions命令只是检查层次结构并选择正确的 Python 版本,以便在运行“垫片可拦截”命令(如pythonpip)时使用。

当您运行时pyenv global 3.5.0/Users/Soma/.pyenv/version文件会更新为包含“3.5.0”。这是 pyenv 所做的唯一更改。大多数用户都惊讶于pyenv global 3.5.0只更改了文本文件中的一行!

当您运行 时python --version,您的终端将执行与执行任何 shell 命令时相同的步骤:它遍历您的每个目录PATH并查找名为 的第一个可执行文件python

如果你输入echo $PATH,你会得到这样的东西:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

您的机器正在目录中查找python可执行文件/usr/bin

您可以将此代码添加到您的~/.bash_profile文件中以更改您的 PATH。

if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
Run Code Online (Sandbox Code Playgroud)

重新启动终端,echo $PATH再次运行,您现在将看到如下输出:/Users/Soma/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

请注意该/Users/Soma/.pyenv/shims目录在PATHnow开头的位置。当您运行python --version现在,该命令将被处理python执行。在这/Users/Soma/.pyenv/shims。该命令将没有机会被拿起,/usr/bin/python因为它会/Users/Soma/.pyenv/shims/python首先被抓住。

我明白为什么这个错误会让你感到困惑。除非您知道pyenv如何工作的,否则很难调试它。

  • 所以我用你和@Joey Iglesias 的答案解决了我的问题,你的答案帮助我理解了 pyenv 的工作。如果有人想知道我如何解决这个问题,请查看他的答案下的评论。 (2认同)

Jon*_*ers 8

运行pyenv init并按照它告诉你的去做。
对我来说,解决方案是将以下内容添加到.profile

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
Run Code Online (Sandbox Code Playgroud)

还将这一行添加到.bashrc

eval "$(pyenv init -)"
Run Code Online (Sandbox Code Playgroud)

不要忘记重新启动 shell。(关闭并重新打开或exec "$SHELL"


Ian*_*ith 8

[ 2021 年 11 月 ]

这就是我在 Mac OSX 上使用 ZSH 解决问题的方法。pyenv 在解释需要添加到 zsh 配置中的内容方面做得很糟糕。$PYENV_ROOT 未定义。顺序很重要。

将其添加到 ~/.zshrc 配置顶部附近:

export PATH="$HOME/.pyenv/bin:$PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH"
PYENV_ROOT=$(pyenv root)
Run Code Online (Sandbox Code Playgroud)


Tho*_*ink 8

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


nej*_*obi 7

python仅供参考,如果您的可执行文件被发现早于 pyenv 的 shim 位置,那么当您在 shell 中键入时,您将无法更改 python 版本。

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

如果你的路径看起来像

/usr/bin:/home/kenobi/.pyenv/shims:...
Run Code Online (Sandbox Code Playgroud)

如果你有一个 python 可执行文件/usr/bin,你将无法正确使用 pyenv。~/.bashrc你应该像下面这样安排你的 PATH 配置

/home/kenobi/.pyenv/shims:/usr/bin:...
Run Code Online (Sandbox Code Playgroud)

然后重新启动你的 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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我在export PATH=/usr/bin:$PATHpyenv 配置行之后。然后我通过切换块解决了这个问题,如下所示

# 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)"
Run Code Online (Sandbox Code Playgroud)


KZi*_*vas 5

在 ubuntu 中, ~/ .bashrc文件需要更新并更改eval "$(pyenv init -)"eval "$(pyenv init --path)"

  • 这也是我在 MacO 上的解决方案。谢谢。 (19认同)

sam*_*ize 5

检查你的PATH。不知怎的.pyenv/bin,当它应该是的时候,我已经做到了.pyenv/shims

export PATH="$HOME/.pyenv/shims:$PATH"使用(并添加到 zshrc 等)修复路径。


Bob*_*oby 5

对我来说,这在通过 Homebrew 安装后使用 ZSH 在 MacOS 上工作:

echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
Run Code Online (Sandbox Code Playgroud)

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

  • 就我而言,没有 ~/.zprofile 文件,并且 ~/.zshrc 根本没有提到 pyenv,所以我只是运行 `echo 'eval "$(pyenv init --path)"' >> ~/. zshrc` 并且它起作用了。 (4认同)

Azi*_*bro 5

运行后,brew install pyenv最好从pyenvgithub README 中参考有关设置 shell 环境的 OG 文档:

https://github.com/pyenv/pyenv#set-up-your-shell-environment-for-pyenv

从版本 2.3.0 和 zsh 开始,应运行以下命令

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
Run Code Online (Sandbox Code Playgroud)