为什么 pipenv 告诉我 python 的错误版本?

问题描述

我使用以下方法创建了一个虚拟环境:

mkvirtualenv env_name --python=python3.9

然后我尝试从 Pipfile 安装:

pipenv install --dev

但我收到以下错误

pipenv.patched.notpip._internal.exceptions.UnsupportedPythonVersion: pylint requires Python '~=3.6' but the running Python is 2.7.17

我检查了我的 python 版本,它是正确的:

$ python --version
Python 3.9.1

为什么它告诉我我的 python 版本是 2.7.17?当我使用以下命令安装时不会发生这种情况:

pip install pylint==2.7.2

解决方法

首先,让我们阐明您使用 pipenv 管理虚拟环境的工作流程。

使用 pipenv,您无需使用 mkvirtualenv 或您拥有的任何 virtualenv 实用程序单独创建虚拟环境。基本流程是简单地执行 pipenv install:

Example Pipenv Workflow

克隆/创建项目存储库:

$ cd myproject

从 Pipfile 安装,如果有的话:

$ pipenv install

或者,向您的新项目添加一个包:

$ pipenv install <package>

如果 Pipfile 不存在,这将创建一个。如果确实存在,它 将使用您提供的新包自动进行编辑。

接下来,激活 Pipenv shell:

$ pipenv shell 
$ python --version

这将产生一个新的 shell 子进程,它可以被停用 使用退出。

这应该会创建虚拟环境在一个命令中安装您的依赖项。自动创建的虚拟 env 文件夹是 based on the path of the current directory where you ran the command:

  • virtualenv 使用项目根目录的名称加上项目根目录的完整路径的哈希值全局存储 (例如,my_project-a3de50)。
  • 如果您更改项目的路径,则会破坏这样的默认映射,pipenv 将无法再找到和使用项目的路径 虚拟环境。

我猜测您单独执行 mkvirtualenv 的原因是为了控制存储/管理虚拟 env 文件夹的位置。 pipenv 也为此提供了选项:

Custom Virtual Environment Location

Pipenv 自动遵守 WORKON_HOME 环境变量,如果 你已经设置好了——所以你可以告诉 pipenv 存储你的虚拟 您想要的任何环境,例如:

$ export WORKON_HOME=~/.venvs

另外,你也可以让 Pipenv 把 virtualenv 粘在 project/.venv 通过设置 PIPENV_VENV_IN_PROJECT 环境 变量。

根据你的尝试

$ mkvirtualenv env_name --python=python3.9

mkvirtualenv 引用表示这意味着“在 env_name 文件夹中创建一个 WORKON_HOME”。当您执行 pipenv install 时,它不会使用相同的虚拟 env 目录,因为如上所述,它会根据“名称”自动生成虚拟 env 目录项目的根目录加上项目根目录的完整路径的哈希”。因此,env_name 中发生的任何事情都将被忽略。

使用 pipenv,您只需设置 WORKON_HOME 文件夹,然后 pipenv install 应在同一文件夹下创建您的虚拟环境。每次需要激活它时,cd 进入您的项目目录,然后执行 pipenv shell

现在,对于 Python 版本问题。默认情况下,当您执行 pipenv install 时,它使用 Pipfile 中列为 python_version 的任何内容,例如:

[requires]
python_version = "3.8"

它会扫描您的系统并寻找兼容的 Python 安装。现在,您似乎已经有一个包含 "2.7" 的现有 Pipfile。或者可能已经有一个现有的虚拟环境(由之前的 pipenv install 调用创建并使用了 Python 2.7)。无论如何,即使您使用 Python 3.9 mkvirtualenv-ed 一个 env_name,正如我已经提到的那样,它被忽略,并且 pipenv 仍然使用 Python 2.7 版本,这导致错误:

pipenv.patched.notpip._internal.exceptions.UnsupportedPythonVersion:  ...

要解决此问题,请通过使用 --rm 删除任何预先存在的虚拟环境重新开始:

$ cd yourproject
$ pipenv --rm
Removing virtualenv (/path/to/.venvs/myproject-wv1hzz4Y)...

然后检查您现有的 Pipfile 是否在 python_version 中设置了正确的版本。

[requires]
python_version = "3.9"

通常情况下,如果您最初正确使用 pipenv install,则不必手动设置版本。要指定正确的版本,您需要传入一个 --python 选项,类似于您对 mkvirtualenv 所做的:

$ python3 -V
Python 3.9.2

$ which python3
/usr/local/bin/python3
   
$ pipenv install --python=/usr/local/bin/python3 
Creating a virtualenv for this project...
...
Using /usr/local/bin/python3 (3.9.2) to create virtualenv...

$ pipenv shell
$ python -V
Python 3.9.2

如果还没有 Pipfile,pipenv 将创建一个并正确设置 python_version