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

Kes*_*iya 0 python pip virtualenv virtualenvwrapper pipenv

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

mkvirtualenv env_name --python=python3.9
Run Code Online (Sandbox Code Playgroud)

然后我尝试从 Pipfile 安装:

pipenv install --dev
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

pipenv.patched.notpip._internal.exceptions.UnsupportedPythonVersion: pylint requires Python '~=3.6' but the running Python is 2.7.17
Run Code Online (Sandbox Code Playgroud)

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

$ python --version
Python 3.9.1
Run Code Online (Sandbox Code Playgroud)

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

pip install pylint==2.7.2
Run Code Online (Sandbox Code Playgroud)

Gin*_*pin 7

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

\n

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

\n

Pipenv 工作流程示例

\n
\n

克隆/创建项目存储库:

\n
$ cd myproject\n
Run Code Online (Sandbox Code Playgroud)\n

从 Pipfile 安装(如果有):

\n
$ pipenv install\n
Run Code Online (Sandbox Code Playgroud)\n

或者,将包添加到您的新项目中:

\n
$ pipenv install <package>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

接下来,激活 Pipenv shell:

\n
$ pipenv shell \n$ python --version\n
Run Code Online (Sandbox Code Playgroud)\n

这将生成一个新的 shell 子进程,可以通过使用 exit 来停用该子进程。

\n
\n

这应该创建虚拟环境通过一个命令安装依赖项。自动创建的虚拟环境文件夹基于您运行命令的当前目录的路径

\n
\n
    \n
  • virtualenv 使用项目\xe2\x80\x99s 根目录的名称加上项目\xe2\x80\x99s 根目录\n 的完整路径的哈希值进行全局存储(例如,my_project-a3de50)。
  • \n
  • 如果更改project\xe2\x80\x99s路径,则会破坏这样的默认映射,并且pipenv将无法再找到并使用project\xe2\x80\x99s\nvirtualenv。
  • \n
\n
\n

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

\n

自定义虚拟环境位置

\n
\n

Pipenv 会自动遵循WORKON_HOME环境变量,如果\n您设置了 \xe2\x80\x94,这样您就可以告诉 Pipenv 将您的虚拟\n环境存储在您想要的任何位置,例如:

\n
$ export WORKON_HOME=~/.venvs\n
Run Code Online (Sandbox Code Playgroud)\n

project/.venv此外,您还可以通过设置环境变量让 Pipenv 将 virtualenv 粘贴到其中PIPENV_VENV_IN_PROJECT

\n
\n

从你尝试过的

\n
$ mkvirtualenv env_name --python=python3.9\n
Run Code Online (Sandbox Code Playgroud)\n

mkvirtualenv参考说这意味着“在文件夹创建一个”。当您这样做时,它不会使用相同的虚拟环境目录,因为如上所述,它会根据项目名称\xe2\x80\x99s根目录加上哈希值自动生成虚拟环境目录项目\xe2\x80\x99s root 的完整路径”。所以无论发生什么都会被忽略。env_nameWORKON_HOMEpipenv installenv_name

\n

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

\n

现在,针对Python版本问题。默认情况下,当您这样做时pipenv install,它会使用 Pipfile 上列出的任何内容python_version,例如:

\n
$ cd myproject\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
pipenv.patched.notpip._internal.exceptions.UnsupportedPythonVersion:  ...\n
Run Code Online (Sandbox Code Playgroud)\n

要解决此问题,请使用以下命令删除任何预先存在的虚拟环境来重新开始--rm

\n
$ pipenv install\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ pipenv install <package>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ pipenv shell \n$ python --version\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n