【发布时间】: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.executable、sys.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