使用pyenv-virtualenv:激活/停用虚拟环境时,Python和PIP未更改

hpcdzsge  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(207)

我在我的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
如果在shell中配置了eval“$(pyenv virtualenv-init -)”,则pyenv-virtualenv将在进入/离开包含.python-version文件的目录时自动激活/停用virtualenvs,该文件包含有效虚拟环境的名称,如pyenv virtualenvs的输出所示(例如,上面示例中的venv 34或3.4.3/envs/venv 34)。.python-version文件被pyenv用来表示本地Python版本,可以使用pyenv local命令创建和删除。

第一个问题是:为什么这个不管用?为什么在进入/离开包含.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返回Python 3.8.1

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

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

q8l4jmvw

q8l4jmvw1#

事实证明,为了在进入/离开目录时自动激活/停用venv,其中的.python-version文件必须包含venv name,而不是与venv关联的Python version
所以执行: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

删除这些行后,一切都按预期工作。
如果仍然有任何问题,请确保您在.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
9bfwbjaz

9bfwbjaz2#

我也有类似的问题。解决方案是更改我放在~/.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-852599456https://www.giters.com/pyenv/pyenv-virtualenv/issues/407]

相关问题