首页 > 解决方案 > Snakemake - Jupyter 实验室笔记本找不到内核

问题描述

在使用 R 或 python 在 jupyter lab notebook 中编写程序时,我将特定的 conda 环境安装为内核,以从基本 conda 环境中的单个 jupyter lab 安装访问特定于环境的包

在完成笔记本的开发后,我想将它插入我的蛇形文件以确保以后的可重复性,当然,我使用相应的 conda 环境 .yaml 文件来执行此操作,以便提供所有需要的包/库。

现在问题来了:引用笔记本的规则在另一台机器/环境上不可重现,因为它试图访问/运行特定于我的开发环境的内核

有没有人有这个特定问题的解决方法或解决方案?

编辑: 导致我的问题的更详细的步骤

  1. 为特定工具或任务(此处:matplotlib)设置 conda 环境(matplotlib_env)
conda create -n matplotlib_env python=3.8 ipykernel matplotlib nbconvert
  1. 我创建了一个 ipython 内核,因此基础环境中的jupyter-lab 实例可以访问 conda 环境和相应的包(matplotlib)
python -m ipykernel install --user --name matplotlib_env --display-name "Python_maplotlib"
  1. 我创建了一个简短的笔记本(1),它使用在步骤 2 中配置的内核(Pyhton_matplotlib 2
import matplotlib.pyplot as plt
plt.plot([1,2,3],[1,4,9])
plt.savefig('exp.png')
  1. 完成任务后,出于管理和可重复性的原因,我想将其插入我的蛇形工作流程。为此,我使用各自的 notebook 和 conda 环境 .yaml 文件定义了一个规则(通过:自动生成conda env export > matplotlib_env.yaml)。
rule make_plot:
    output:
        "exp.png"
    conda:
        "matplotlib_env.yaml"
    notebook:
        "make_plot.ipynb"
  1. 只要原始 conda 环境(带有配置的内核)仍然存在,执行规则就可以正常工作。一旦我删除了原始的 conda 环境(也可以从 kernelspec 列表中删除内核),我会收到一条错误消息,因为无法再找到内核并且 snakemake 生成的 conda 环境不拥有内核,笔记本正在寻找.
snakemake -p --cores 1 --use-conda make_plot

删除原始环境后的错误消息

[NbConvertApp] ERROR | Failed to run command:
...
FileNotFoundError: [Errno 2] No such file or directory: '/home/miniconda3/envs/matplotlib_env/bin/python'

从内核列表中删除内核后的错误消息

...
raise NoSuchKernel(kernel_name)
jupyter_client.kernelspec.NoSuchKernel: No such kernel named matplotlib_env

标签: jupyter-notebookjupyter-labsnakemakejupyter-kernel

解决方案


我找到了一种解决方法:在保存笔记本之前,最后一次将内核从基本环境切换到默认的 python 或 R 内核。这些在安装后始终具有相同的默认名称(例如“Python 3”)。因此,当通过snakemake 执行时,notebook 会查找默认的 Python/R 内核并找到通过snakemake --use-conda 选项提供的新安装。

这不是最优雅的版本,但如果您需要/想要将笔记本插入您的工作流程,它就足够了。

最严格的方法是在完成后将笔记本变成具有明确定义的输入和输出的脚本。然后通过相应的规则而不是笔记本将该脚本插入到蛇文件中。


推荐阅读