Conda及pipenv环境无法与Jupyter正常适配,包导入与内核异常问题求助
问题概述
7月的某一天我发现Jupyter无法导入我安装在Conda环境中的Seaborn版本,它会从全局目录拉取旧版本的Seaborn,核查后发现其余所有包都存在该问题。经过多次修复尝试后,Jupyter现在甚至无法导入任何包,我切换到pipenv测试也出现了相同问题。在Conda和pipenv两种环境下,sys.path都显示了大量无法确认用途的路径变量,有时包含目标环境路径,有时不包含,但无论如何Jupyter的导入逻辑都会忽略我指定使用的环境路径,转而查找我为了解决该问题在7月就已经删除的全局包。除此之外(二者可能以我暂未理解的方式相互关联),我也无法获得能够将Jupyter连接到安装了对应包的目标环境目录的内核,Jupyter始终使用全局Python而非环境内的Python实例。我不太清楚内核的创建机制,但可以确定的是部分新环境没有生成对应内核、内核无法访问环境专属的Python和包,或是内核连接失败(加载过时的kernel.json文件后启动失败)。
预期解决效果
如何让JupyterLab从指定的环境目录中导入对应版本的包?更深层的需求是,如何让环境恢复之前的自动功能:[1] 创建自身专属的Python实例;[2] 创建可被Jupyter识别的专属内核;[3] 生成指向自身环境的路径;[4] 在Jupyter Lab中完成上述所有配置的初始化?
已尝试的解决方案
- 停用base环境:诚然7月前几周我没有做该操作,后来才想起这是Windows下使用Conda的必要操作,但现在我已经常规停用base环境,问题却仍然存在。
- 卸载Anaconda后重装Miniconda
- 删除了设备上所有零散/旧版本的Python,重装了用户级的全新Python 3.9
- 通过
conda list命令核查确认包已成功安装,只是无法在JupyterLab中正常导入 - 在Windows设置中调整过Path变量,但操作非常谨慎,不确定是否调整正确,毕竟3个月过去了问题仍然存在,也不清楚应该编辑用户变量还是系统变量,以及如何稳妥地裁剪路径。
- 重装jupyter和jupyterlab
- 重装ipykernel
- 发现
sys.executable、sys.path和!where python在shell的Python中与Jupyter Lab的Python中输出结果不一致 - 在JupyterLab中手动切换内核(通常手动选择的内核无法正常启动)
- 尝试在notebook中手动改写
sys.path - 尝试从全新的pipenv而非Miniconda中启动JupyterLab
- 8月时我曾在VS Code中使用原生Python让pipenv成功适配Streamlit小应用(这可能说明问题仅出在Jupyter侧?自7月JupyterLab出现问题后,我只能在Google Colab中继续开展基于Jupyter的项目)
更多细节
我筛选出了3个最典型的代码/报错片段,希望能帮助定位问题关键点。
[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]
在shell的Python中运行sys.executable,输出的是环境内正确的Python路径:
>>> sys.executable 'C:\\Users\\David.000\\miniconda3\\envs\\aucu_ml\\python.exe'
但在Jupyter Lab中运行sys.executable,却指向了全局Python:
sys.executable 'C:\\Python39\\python.exe'
[3]
在shell的Python中运行sys.path,输出了我需要的环境专属路径(不过路径数量为什么这么多?)
>>> 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']
但在Jupyter Lab中运行sys.path,也显示了大量路径,其中很多是不需要的全局路径:
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']
解决方案
第一步:清理残留Jupyter配置
删除C:\Users\David.000\AppData\Roaming\jupyter\kernels目录下所有文件,清除历史无效内核配置。同时清空C:\Users\David.000\AppData\Roaming\jupyter\runtime目录下的所有临时文件,解决空白kernel.json导致的启动失败问题。
第二步:为目标环境单独注册内核
激活需要使用的Conda环境aucu_ml,在环境终端执行以下命令:
pip install ipykernel python -m ipykernel install --user --name aucu_ml --display-name "Python (aucu_ml)"
执行完成后会自动生成对应环境的内核配置,kernel.json将直接指向该环境的python.exe路径,无需手动修改。
第三步:规范Jupyter启动方式
不要在全局环境或base环境启动JupyterLab,每次使用前先激活对应Conda/pipenv环境,在环境终端执行jupyter lab启动,此时Jupyter会优先加载当前环境的配置,内核列表会自动显示已注册的环境内核。
第四步:修复路径优先级
编辑Windows用户变量的Path,将Miniconda的envs目录、对应环境的根目录、Scripts目录的排序提到全局Python 3.9路径之前;同时删除用户变量中冗余的全局Python路径引用,避免路径串扰。
如果仍出现sys.path包含全局路径的问题,在当前用户目录下新建.env文件,添加内容PYTHONPATH="",禁用全局site-packages的自动加载。
验证操作
启动JupyterLab后选择对应名称的内核,执行sys.executable确认路径指向环境内的python.exe,执行import seaborn; print(seaborn.__version__)验证包版本与conda list输出一致即可。
内容的提问来源于stack exchange,提问作者David d'Operazione

