【问题标题】:Issues with pyenv-virtualenv: Python and PIP not changed when activating / deactivating virtual environmentpyenv-virtualenv 的问题:激活/停用虚拟环境时 Python 和 PIP 未更改
【发布时间】:2020-05-29 10:42:44
【问题描述】:

我在我的 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 将自动激活/停用 virtualenvs 进入/离开包含 .python-version 文件的目录 包含有效虚拟环境的名称,如 pyenv virtualenvs 的输出(例如,venv34 或 3.4.3/envs/venv34 in 上面的例子)。 pyenv 使用 .python-version 文件来表示 本地 Python 版本,可以使用 pyenv 创建和删除 本地命令。


所以第一个问题是:为什么这不起作用?为什么虚拟环境在进入/离开包含.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“测试”是否被激活,行为都是相同的。 我希望在激活“测试”后,命令python --version 返回Python 3.8.1

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

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

【问题讨论】:

    标签: python python-3.x pip virtualenv pyenv


    【解决方案1】:

    事实证明,为了在进入/离开目录时自动激活/停用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
    

    删除这些行后,一切正常。

    【讨论】:

    • 您是如何提出这个解决方案的?它是实验性的还是你在其他地方找到了一些关于 pyenv 内部的很好的信息来源?我的意思是 pyenv 很棒,但官方文档对底层细节有些模糊。
    • 对于第一个问题,我问了一些问题......我认为这让很多人感到困惑,因为.python-version 建议它包含 Python 版本,但实际上它必须包含虚拟环境名称(文档中实际上明确说明了什么,但我仍然犯了这个错误......)第二个问题是我自己造成的。
    • 谢谢!我永远不会想到这一点,因为pyenv local --help 返回Usage: pyenv local <version> <version2> <..>。这太非常欺骗了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      相关资源
      最近更新 更多