pyenv-virtualenv 的问题:Python 和 PIP 在激活/停用虚拟环境时未更改

Issues with pyenv-virtualenv: Python and PIP not changed when activating / deactivating virtual environment

我在 Ubuntu 16.04 VPS 上使用 Linuxbrew (Homebrew 2.2.5) 安装了 pyenv-virtualenv。 pyenv 版本为:1.2.16。现在当我做这样的测试时:

pyenv install 3.8.1
pyenv virtualenv 3.8.1 test
cd /.pyenv/versions/3.8.1/envs/test
pyenv local 3.8.1

然后进入/离开 /.pyenv/versions/3.8.1/envs/test 不会激活停用虚拟环境,而且我在 shell 中看不到 (test) username:~。我还创建了一个 /home/users/test 目录和 .python-version 目录,但仍然进入/离开目录没有任何作用。

根据documentation

If eval "$(pyenv virtualenv-init -)" is configured in your shell, pyenv-virtualenv will automatically activate/deactivate virtualenvs on entering/leaving directories which contain a .python-version file that contains the name of a valid virtual environment as shown in the output of pyenv virtualenvs (e.g., venv34 or 3.4.3/envs/venv34 in example above) . .python-version files are used by pyenv to denote local Python versions and can be created and deleted with the pyenv local command.


所以第一个问题是:为什么这不起作用?为什么虚拟环境在进入/离开包含 .python-version 文件的目录时不会自动激活/停用?

另外,当我手动激活 virtualenv pyenv activate test 然后检查 Python 版本时,它会打印系统 Python 版本而不是来自环境的版本:Python 3.8.1 :

python --version
Python 3.7.6

我只能通过直接引用 virtualenv shims Python 来获得正确的 Python 版本:

which python
/home/andre/.pyenv/shims/python
/home/andre/.pyenv/shims/python --version
Python 3.8.1

无论是否激活 virtualenv "test",行为都是相同的。 我希望在激活 "test" 命令后 python --version returns Python 3.8.1

那么第二个问题:为什么在激活/停用虚拟环境时pippython没有切换?

这些是 pyenv 错误吗?还是我做错了什么?

事实证明,为了在进入/离开目录时自动激活/停用 venv,其中的 .python-version 文件必须包含 venv name 而不是 Python versionvenv

关联

所以执行: pyenv local 3.8.1 创建一个 .python-version 文件,其中仅包含 Python 版本 3.8.1。 然后进入/离开包含 .python-version 文件的目录将设置/取消设置该文件中指定的 Python 版本,但不会激活/停用任何 venv

要创建一个 .python-version 文件来执行这两项操作:激活虚拟环境并设置 Python 版本 命令应该如下所示: pyenv local test 其中 test 是一个venv 创建于: pyenv virtualenv 3.8.1 test.

因此在 .python-version 中将 3.8.1 更改为 test 解决了问题。 完成此操作后,进入/离开包含 .python-version.

的目录时,venv 被激活/停用

但 Python 版本仍未更改为与 venv 关联的版本(在本例中为 3.8.1

然后我发现我的 .profile 中有两行导致了这个问题:

alias python=/home/linuxbrew/.linuxbrew/bin/python3
alias pip=/home/linuxbrew/.linuxbrew/bin/pip3

删除这些行后一切正常。

我也有类似的问题。解决方案是更改我在 ~/.bashrc 中输入的条目。我继续导出变量 export PYENV_ROOT="$HOME/.pyenv" 并添加行 eval "$(pyenv init --path)".

运行 下面的完整命令,它会将必要的条目添加到您正在使用的用户的 ~/.bashrc

read -r -d '' FILE_CONTENT << 'HEREDOC'
BEGIN

# >>>>>>
# pyenv configurations.

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)" # This only sets up the path stuff.
eval "$(pyenv init -)" # This makes pyenv work in the shell.
eval "$(pyenv virtualenv-init -)" # Enabling virtualenv so it works natively.
# <<<<<<

END
HEREDOC
echo -n "${FILE_CONTENT:6:-3}" | tee -a ~/.bashrc

注意: 在 Manjaro 上测试(Linux,基于 Arch)。

谢谢! =D

[Ref(s).: https://github.com/pyenv/pyenv-installer , https://github.com/pyenv/pyenv , https://realpython.com/intro-to-pyenv/ , https://github.com/pyenv/pyenv-virtualenv/issues/390#issuecomment-852599456 , https://www.giters.com/pyenv/pyenv-virtualenv/issues/407 ]