在wsl2 Ubuntu实例上安装pyenv-win会破坏Ubuntu pyenv



在过去的一年里,我一直在wsl2下的ubuntu 22.04中使用pyenv。它工作得很好,我在安装python版本并为项目设置它们时没有任何问题。我现在有一个windows应用程序项目,我想在windows上工作(这是一个GUI应用程序)。我找到了pyenv-win,当我安装它时,它破坏了我的wsl2安装。当它启动时,我得到以下错误:

-bash: /mnt/c/Users/mryan/.pyenv/pyenv-win/bin/pyenv: /bin/sh^M: bad interpreter: No such file or directory

所以mryan是我的windows用户名。我的ubuntu用户名是dev。

我也搞砸了我的ubuntu安装,所以我提交这个问题后要做的是恢复我的windows系统到昨天之前,我开始这个过程。然后我将从头开始安装windows pyenv-win。

还有其他人经历过吗?你知道怎样才能让这一切顺利进行吗?我应该从ubuntu上卸载pyenv,然后在windows上安装它,然后在ubuntu上重新安装它吗?我感觉这是一个路径问题,窗口和ubuntu重叠?

问题

我有同样的问题,在Windows+WSL设置中同时使用pyenv-win和pyenv可能会导致环境变量冲突。

这是因为WSL将Windows PATH附加到Linux的$PATH变量。因此,无论何时在WSL终端中输入pyenv,系统都会查找引用pyenv-win而不是pyenv的$PATH变量。它试图读取/mnt/c/Users/<username>/.pyenv/pyenv-win/bin/pyenv,但无法读取。即使您使用sed -i -e 's/r$//' /mnt/c/Users/<username>/.pyenv/pyenv-win/bin/pyenv命令让操作系统读取它,您也会遇到其他问题,因为pyenv-win是为Windows构建的。

解决方案

不要卸载任何东西,让我们确保Windows指向pyenv-win, WSL指向pyenv。在确保两者都正确安装之后,只需将WSL $PATH中指向pyenv-win可执行文件的WSL路径替换为指向pyenv可执行文件的路径。

在哪里执行此操作可能取决于您的系统。请阅读有关如何正确设置的文档。在Ubuntu中,默认的shell可能是bash,启动配置在~/中。bashrc 、~/。,和/或~/. bash_profile

简而言之,只需在~/中添加以下内容。bashrc 、~/。配置文件和/或~/。bash_profile文件:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

请注意,与文档相反,我们已经更改了command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"。这是因为在安装了pyenv-win的WSL中,第一个条件将返回true,并且您的PATH将永远不会更新。

如果您不希望$PATH变量有多余的路径,不要在$PATH的开头添加$PYENV_ROOT,您可以简单地使用sed命令将$PATH变量中的pyenv-win路径替换为pyenv路径。例如,您可以输入以下代码片段,而不是上面的脚本:

export PYENV_ROOT="$HOME/.pyenv"
BIN_OLD="/mnt/c/Users/<username>/.pyenv/pyenv-win/bin"
BIN_NEW="$PYENV_ROOT/bin"
SHIMS_OLD="/mnt/c/Users/<username>/.pyenv/pyenv-win/shims"
SHIMS_NEW="$PYENV_ROOT/shims"
export PATH=`echo $PATH | sed "s@$BIN_OLD@$BIN_NEW@" | sed "s@$SHIMS_OLD@$SHIMS_NEW@"`
eval "$(pyenv init -)"

您的问题来自Windowspyenv安装干扰WSL2Ubuntupyenv安装,按照以下步骤解决:

首先从Windows和WSL2 Ubuntu环境中卸载pyenv,然后在WSL2上安装它(pyenv) https://github.com/pyenv/pyenv#installation,然后在Windows上安装pyenv-win,然后更新Windows PATH变量以删除对pyenv-win的引用。转到"环境变量"然后点击"系统变量",找到名为Path的变量。编辑它并删除与pyenv-win相关的任何条目,然后创建一个新的Windows用户环境变量PYENV_WIN,并将其设置为C:Usersmryan.pyenvpyenv-win

现在,当您需要在Windows命令提示符或PowerShell中使用pyenv-win时,执行以下命令:set PATH=%PYENV_WIN%bin;%PYENV_WIN%shims;%PATH%

对于PowerShell:$env:Path = "$env:PYENV_WINbin;$env:PYENV_WINshims;$env:Path"