pipenv + pyenv + jupyter
pipenv + pyenv + jupyter
我使用 pyenv 安装和管理不同版本的 python 以及我系统上各种项目的虚拟环境。但是 pipenv 是现在推荐的管理虚拟环境的工具,我喜欢它的很多特性。大多数情况下一切正常,但是当涉及到 Jupyter notebook 时,pipenv 似乎有漏洞或其他问题。以下是在我的机器上复制问题的步骤。
- 使用
brew install pipenv
安装 pipenv。
- 使用
pyenv install 3.6.3
安装新版本的 Python,并通过 pyenv global 3.6.3
. 激活它
- 安装 Jupyter notebook 和另一个软件包,例如
pip install jupyter requests
.
- 创建一个新目录并导航到其中;使用
pipenv install
创建一个 pipenv 项目
- 使用
pipenv shell
激活pipenv虚拟环境。
- 不安装任何包,并使用
pip list
确认none已安装在当前的virtualenv中。 (我只得到 pip
、setuptools
和 wheel
。)
- 运行
jupyter notebook
。我的期望:控制台出错并显示 jupyter: command not found
。实际:笔记本服务器和浏览器 UI 正常启动。
- 创建一个新笔记本并导入第 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安装没问题,可以留下来。它也是您应该使用的主要工具。您应该不需要直接执行 pip
或 pyenv
。
您应该将 jupyter 安装到 pipenv virtualenv 中,然后您应该进行安装,该安装仅在加载 pipenv virtualenv 时有效。
我使用 pyenv 安装和管理不同版本的 python 以及我系统上各种项目的虚拟环境。但是 pipenv 是现在推荐的管理虚拟环境的工具,我喜欢它的很多特性。大多数情况下一切正常,但是当涉及到 Jupyter notebook 时,pipenv 似乎有漏洞或其他问题。以下是在我的机器上复制问题的步骤。
- 使用
brew install pipenv
安装 pipenv。 - 使用
pyenv install 3.6.3
安装新版本的 Python,并通过pyenv global 3.6.3
. 激活它
- 安装 Jupyter notebook 和另一个软件包,例如
pip install jupyter requests
. - 创建一个新目录并导航到其中;使用
pipenv install
创建一个 pipenv 项目
- 使用
pipenv shell
激活pipenv虚拟环境。 - 不安装任何包,并使用
pip list
确认none已安装在当前的virtualenv中。 (我只得到pip
、setuptools
和wheel
。) - 运行
jupyter notebook
。我的期望:控制台出错并显示jupyter: command not found
。实际:笔记本服务器和浏览器 UI 正常启动。 - 创建一个新笔记本并导入第 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安装没问题,可以留下来。它也是您应该使用的主要工具。您应该不需要直接执行 pip
或 pyenv
。
您应该将 jupyter 安装到 pipenv virtualenv 中,然后您应该进行安装,该安装仅在加载 pipenv virtualenv 时有效。