pyenv-virtualenv的问题:激活/停用虚拟环境时,Python和PIP没有改变



我在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,但仍然进入/离开目录没有任何作用。

根据文档:

如果在 shell 中配置了 eval "$(pyenv virtualenv-init -(", pyenv-virtualenv 将自动激活/停用 virtualenvs on 输入/离开包含 .python 版本文件的目录 包含有效虚拟环境的名称,如 pyenv virtualenvs 的输出(例如,venv34 或 3.4.3/envs/venv34 in 上面的例子(。.python版本文件被pyenv用来表示 本地 Python 版本,可以使用 pyenv 创建和删除 本地命令。


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

同样,当我手动激活 virtualenvpyenv activate test然后检查 Python 版本时,它会打印系统 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

无论是否激活虚拟环境"测试",行为都是相同的。 我希望在激活"测试"后,命令python --version返回Python 3.8.1

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

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

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

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

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

因此,将3.8.1更改为.python-version中的test解决了问题。 完成此操作后,venv在进入/离开包含.python-version的目录时被激活/停用。

但是Python版本仍然没有更改为与venv相关的版本(在这种情况下3.8.1

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

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

删除这些行后,一切按预期工作。

如果仍然有任何问题,请确保您的.profile.bash_profile中有这些行,无论您使用哪一个:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
if command -v pyenv 1>/dev/null 2>&1; then
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
fi

我也有类似的问题。解决方案是更改我放入~/.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

[参考文献: 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 ]

最新更新