При написании программы в лабораторной записной книжке jupyter с использованием R или python я устанавливаю определенные среды conda в качестве ядер для доступа к этим пакетам, зависящим от среды, из одной лабораторной установки jupyter в базовой среде conda.
После завершения разработки ноутбука я хочу вставить его в свой файл snakemake, чтобы обеспечить воспроизводимость в дальнейшем, и, конечно же, я делаю это с соответствующим файлом среды conda .yaml, чтобы были предоставлены все необходимые пакеты / библиотеки.
Теперь возникает проблема: правило, которое ссылается на записную книжку, не воспроизводится на другой машине / среде, поскольку оно пытается получить доступ / запустить ядро, специфичное для моей среды разработки.
Есть ли у кого-нибудь обходной путь или решение этой конкретной проблемы?
РЕДАКТИРОВАТЬ: Более подробные инструкции по устранению моей проблемы
- Настройте среду conda (matplotlib_env) для определенного инструмента или задачи (здесь: matplotlib)
conda create -n matplotlib_env python=3.8 ipykernel matplotlib nbconvert
- Я создал ядро ipython, чтобы мой экземпляр jupyter-lab из базовой среды мог получить доступ к среде conda и соответствующим пакетам (matplotlib)
python -m ipykernel install --user --name matplotlib_env --display-name "Python_maplotlib"
- Я создал небольшую записную книжку (1), в которой используется ядро, настроенное на шаге 2 (Pyhton_matplotlib 2)
import matplotlib.pyplot as plt
plt.plot([1,2,3],[1,4,9])
plt.savefig('exp.png')
- Выполнив задачу, я хочу включить ее в свой рабочий процесс snakemake для управления и воспроизводимости. Для этого я определяю правило с соответствующим файлом .yaml среды ноутбука и conda (автоматически сгенерированным через:
conda env export > matplotlib_env.yaml
).
rule make_plot:
output:
"exp.png"
conda:
"matplotlib_env.yaml"
notebook:
"make_plot.ipynb"
- Выполнение правила работает нормально, пока существует исходная среда conda (с настроенным ядром). Как только я удаляю исходную среду conda (необязательно также ядро из списка kernelspec), я получаю сообщение об ошибке, так как ядро больше не может быть найдено, а среда conda, созданная snakemake, не имеет ядра, ноутбук ищет .
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
Вы работаете с --use-conda
? Можете ли вы опубликовать правило записной книжки и conda yaml? Я не использовал конкретную среду conda для правил записной книжки, но она должна работать. — person sreichl schedule 23.11.2020
Привет, спасибо за ответ и интерес! Да, я использую —use-conda. Я отредактировал исходный пост и добавил минимальный пример проблемы, с которой я столкнулся. — person sreichl schedule 07.12.2020
Я нашел обходной путь: перед сохранением ноутбука в последний раз переключите ядро на ядро python или R по умолчанию из вашей базовой среды. После установки они всегда имеют одно и то же имя по умолчанию (например, Python 3). Таким образом, при запуске с помощью snakemake блокнот ищет ядро Python / R по умолчанию и находит новую установку, предоставленную с помощью параметра snakemake —use-conda.
Это не самая элегантная версия, но если вам нужно / вы хотите включить записные книжки в свой рабочий процесс, этого вполне достаточно.
Самым тщательным было бы превратить записную книжку, когда она была сделана, в сценарий с четко определенными входами и выходами. Затем этот сценарий подключается к файлу snakefile через соответствующее правило вместо записной книжки.