pipenv + pyenv + jupyter

pipenv + pyenv + jupyter

我使用 pyenv 安装和管理不同版本的 python 以及我系统上各种项目的虚拟环境。但是 pipenv 是现在推荐的管理虚拟环境的工具,我喜欢它的很多特性。大多数情况下一切正常,但是当涉及到 Jupyter notebook 时,pipenv 似乎有漏洞或其他问题。以下是在我的机器上复制问题的步骤。

  1. 使用 brew install pipenv 安装 pipenv。
  2. 使用 pyenv install 3.6.3 安装新版本的 Python,并通过 pyenv global 3.6.3.
  3. 激活它
  4. 安装 Jupyter notebook 和另一个软件包,例如pip install jupyter requests.
  5. 创建一个新目录并导航到其中;使用 pipenv install
  6. 创建一个 pipenv 项目
  7. 使用pipenv shell激活pipenv虚拟环境。
  8. 不安装任何包,并使用pip list确认none已安装在当前的virtualenv中。 (我只得到 pipsetuptoolswheel。)
  9. 运行jupyter notebook。我的期望:控制台出错并显示 jupyter: command not found。实际:笔记本服务器和浏览器 UI 正常启动。
  10. 创建一个新笔记本并导入第 3 步中的辅助包:import requests。我的期望:抛出 ModuleNotFoundError。实际:导入包,可以正常使用

如果我尝试在 pipenv 虚拟环境中导入辅助包,但在 Jupyter notebook 之外(在 repl 或 Python 脚本中),我会得到预期的 ModuleNotFoundError。所以不知何故,问题出在 jupyter 上。请注意,如果我尝试使用 pyenv 虚拟环境而不是 pipenv 虚拟环境重现此问题,则会发生预期的行为:jupyter notebook 在控制台中产生 jupyter: command not found 错误。

My question is: am I using pipenv in a way that was not intended, or is there an alternative way to use pipenv that avoids this problem?

提前致谢!

问题

在第 1 步中,您使用 brew 安装了 pipenv。 pipenv 的 brew 安装同时安装了 python 环境,直接使用。命令本身在你的路径上,所以你可以独立于你加载的 virtualenv 调用它。

在第 2 步中,您安装并加载了一个 pyenv virtualenv。加载 pyenv virtualenv 会改变你的路径。当你现在使用 pip 时,它是 pyenv 3.6.3 pip,它将安装到那个 pyenv 中。因此,在第 3 步中,当您 运行 pip install jupyter requests 他们进入 pyenv virtualenv.

当您 运行 pipenv 时,在第 4 步中,它将使用它自己的 python,因此它能够自行加载。您在步骤 5 中加载的 pipenv virtualenv 然后将其 bin 文件夹添加到您的路径中,允许您安装 运行 东西。它不会撤消 pyenv 所做的更改。当您在第 6 步 运行 pip 时,它 运行 在此 pipenv virtualenv 中,因此打印已安装软件包的有限列表。

在第 7 步中你 运行 jupyter。这不在 pipenv virtualenv 中,而是在 pyenv 中。 pyenv 路径添加仍然存在,因此它是 运行nable。 jupyter 命令是一个 bash 脚本,它可以神奇地在 运行 之前重置 python 路径。这就是它如何在步骤 8 中找到 requests 模块。

你终于 运行 某种形式的 python 回复。这大概在您的 pipenv virtualenv 中,因此它加载了该环境中的模块。

解决方案

您需要卸载全局pyenv。由于您已将软件包安装到 3.6.3 python 安装中,我还将清除您安装的所有 virtualenvs 和 python 版本。您可以重新安装它们。

你的pipenv安装没问题,可以留下来。它也是您应该使用的主要工具。您应该不需要直接执行 pippyenv

您应该将 jupyter 安装到 pipenv virtualenv 中,然后您应该进行安装,该安装仅在加载 pipenv virtualenv 时有效。