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
目录,但仍然进入/离开目录没有任何作用。
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
那么第二个问题:为什么在激活/停用虚拟环境时pip
和python
没有切换?
这些是 pyenv 错误吗?还是我做错了什么?
事实证明,为了在进入/离开目录时自动激活/停用 venv
,其中的 .python-version
文件必须包含 venv name
而不是 Python version
与 venv
关联
所以执行:
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 ]
我在 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
目录,但仍然进入/离开目录没有任何作用。
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
那么第二个问题:为什么在激活/停用虚拟环境时pip
和python
没有切换?
这些是 pyenv 错误吗?还是我做错了什么?
事实证明,为了在进入/离开目录时自动激活/停用 venv
,其中的 .python-version
文件必须包含 venv name
而不是 Python version
与 venv
所以执行:
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 ]