【问题标题】:Can’t create an environment (Conda or pipenv) that works properly with Jupyter无法创建与 Jupyter 一起正常工作的环境(Conda 或 pipenv)
【发布时间】:2021-10-13 11:35:41
【问题描述】:

多空:

7 月的一天,注意到 Jupyter 没有将我安装的 Seaborn 版本导入到我的 Conda 环境中。它正在从全局目录下载较旧的 Seaborn。当我检查版本时,所有其他包都一样。经过多次尝试解决这个问题,Jupyter 现在甚至不导入包。我也尝试过 pipenv。在 Conda 和 pipenv 中,sys.path 显示的路径变量比我知道的要多,有时包括所需的 env 路径,有时不包括。但无论哪种方式,Jupyter 导入都忽略了我想要使用的 env 路径,而是寻找我自 7 月以来为了解决问题而删除的全局包。最重要的是(但可能以一种我还不理解的方式交织在一起),我没有得到将 Jupyter 连接到安装包的所需 env 目录的内核。使用全局 python 而不是 env 的 python 实例。不确定内核是如何创建的,但我可以说它们不是为一些新的环境创建的,没有访问特定于环境的 python 和包,或者无法连接(加载一个陈旧的 kernel.json 文件并且无法启动。 )

期望的结果:

如何让 JupyterLab 从预期的 env 目录中导入预期的包版本?更深入一点,我如何让环境恢复到它们以前的自动功能 [1] 创建自己的 python 实例,[2] 创建自己的 Jupyter 识别的内核,[3] 创建自己的 env 路径,以及 [4]在 Jupyter Lab 中初始化所有这些?

我尝试过的事情:

  • 停用了基本环境,我承认在 7 月的前几周我并没有这样做,直到我记得这是 Windows Conda 的必需品……但现在我经常停用基本环境,为什么这些问题仍然存在?
  • 卸载 Anaconda 并重新安装 Miniconda
  • 从我的机器中删除(我相信)所有流浪/较旧的 python,重新安装了新的用户级 Python 3.9
  • 已使用conda list 命令验证软件包正在安装。它们只是无法在 JupyterLab 中正确导入
  • 对 Windows 设置中的路径变量进行了一些调整,但非常谨慎,不知道如何/如果我正确修改这些变量。显然不是,尽管 3 个月后问题仍然存在 0.o 不知道我是否应该编辑用户变量或系统变量,或者如何谨慎地修剪路径。
  • 重新安装了 jupyter 和 jupyterlab
  • 重新安装 ipykernel
  • 注意到 sys.executablesys.path!where python 在 shell python 和 Jupyter Lab python 中给出不同的输出
  • 在 JupyterLab 中手动切换内核(通常手动选择的内核是 DOA)
  • 尝试在笔记本中手动重写sys.path
  • 尝试从新的 pipenv 而不是 Miniconda 启动 JupyterLab
  • 在 8 月份,使用 VS Code 中的原始 python 为 Streamlit 小程序正常工作了一个 pipenv(这可能会将问题隔离到 Jupyter?自从 JupyterLab 在 7 月份开始窒息以来,我不得不在 Google 合作中继续另一个基于 Jupyter 的项目。 )

更深入的细节:

Sheesh,这篇文章已经很长了……但在这里我挑选了 4 个最突出的代码/错误 sn-ps。还有更多来自哪里,但希望这里可能有一些你可能认为是大海捞针的东西。

[1]

kernel-session.json 导致死产内核时,它会被创建为一个完全空白的 json 文件。在 conda 终端中运行 jupyter lab 会产生此错误消息,隐藏在输出中:

    Failed to load connection file:
'C:\\Users\\David.000\\AppData\\Roaming\\jupyter\\runtime\\kernel-a6082e80-0b65-48f1-b370-7c2918030185.json'

我发现过去的 kernel-session.json 文件不是死胎,例如这个名为 kernel-b146b600-81e3-418e-a55f-5a3fbbc13471.json 的文件,看起来像这样,自动填充:

{
  "shell_port": 50877,
  "iopub_port": 50878,
  "stdin_port": 50879,
  "control_port": 50880,
  "hb_port": 50881,
  "ip": "127.0.0.1",
  "key": "caa915a4-00a599e8b6c4db6417bcca77",
  "transport": "tcp",
  "signature_scheme": "hmac-sha256",
  "kernel_name": ""
}

[2]

sys.executable,当在 shell python 中运行时,会在 env 中产生正确的 python 位置:

>>> sys.executable
'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\python.exe'

但是sys.executable,当在 Jupyter Lab 中运行时,正在锁定全局 Python:

sys.executable
'C:\\Python39\\python.exe'

[3]

sys.path,当在 shell python 中运行时,似乎产生了我想要的 env 特定路径(虽然为什么有这么多??)

    >>> sys.path
        ['', 'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\python39.zip',
'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\DLLs',
    'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\lib',
    'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml',
    'C:\\Users\\David.000\\AppData\\Roaming\\Python\\Python39\\site-packages',
    'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\lib\\site-packages',
    'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\lib\\site-packages\\win32',
    'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\lib\\site-packages\\win32\\lib',
    'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\lib\\site-packages\\Pythonwin']

sys.path 在 Jupyter Lab 中运行时,也会显示大量路径,其中许多是不需要的全局变量:

sys.path
[> ['C:\\Users\\David.000\\Desktop\\Civic Innovation Corps\\Miami\\Predictive_Analytics_Business_Licensing',
'C:\\Python39\\python39.zip',
'C:\\Python39\\DLLs',
'C:\\Python39\\lib',
'C:\\Python39',
'',
'C:\\Users\\David.000\\AppData\\Roaming\\Python\\Python39\\site-packages',
'C:\\Python39\\lib\\site-packages',
'C:\\Python39\\lib\\site-packages\\win32',
'C:\\Python39\\lib\\site-packages\\win32\\lib',
'C:\\Python39\\lib\\site-packages\\Pythonwin',
'C:\\Python39\\lib\\site-packages\\IPython\\extensions',
'C:\\Users\\David.000\\.ipython']

【问题讨论】:

  • 不幸的是,当其他站点包通过 PYTHONPATH 或通过用户或系统级 Python 安装泄漏到 Conda 环境中时,没有明确定义的行为。当 Conda 是 Python 的唯一来源时,一切都很容易想到。否则,很难提供帮助。
  • 谢谢@merv。那么我应该寻求操纵 PYTHONPATH 来解决这个问题吗?这会推广到未来的环境吗?我将如何让 conda 成为 Python 的唯一来源?

标签: python environment-variables conda jupyter-lab


【解决方案1】:

我可能没有资格回答这个问题,但到底是什么。

我有几个与不同环境相关联的内核,它们被配置为运行不同的程序。我在终端中创建了它们,并且我习惯于在终端中安装任何模块/程序等,在我需要它的激活环境中,而不是在笔记本中安装。

如果我使用的是桌面,那么在打开 Juypter 之前,我会在 anaconda 中选择适当的环境。如果我使用的是虚拟机,则在终端中激活环境,一旦进入笔记本,选择适当的内核。

虽然我不能确定,但​​我认为您的问题是由于您安装或更新软件包的方式/位置而发生的。

【讨论】:

  • 谢谢@newbzzs。为了阐明我的 env 创建的步骤,我(第一次)在 requirements.txt 中列出了我知道我需要的包,然后(第二次)让 conda 从 requirements.txt 创建了 env。我会(第 3 次)在终端(第 4 次)中输入 env 并从那里打开 JupyterLab。我假设指向 env 的 python 的内核是按照该流程自动创建的。不是这样吗?我是否需要重新配置设置才能做到这一点?有一次(我想在我重新安装 ipykernel 之后)我确实为 shell 中的 env 创建了一个内核。那个内核是死产的。
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多