Как использовать ноутбуки Jupyter в среде conda? - PullRequest
2 голосов
/ 23 сентября 2019

Обычно запускается jupyter notebook или jupyter-notebook или ipython notebook в терминале для локального запуска веб-сервера ноутбука Jupyter (и открытия URL-адреса в браузере).При использовании conda и conda сред , каков наилучший способ запуска ноутбука Jupyter, который позволяет импортировать модули Python, установленные в среде conda?

Как представляется, этот является не вполне прямой вперед и многие пользователи имеют похожие проблемы .

Наиболее распространенныесообщение об ошибке выглядит следующим образом: после установки пакета XYZ в среде conda my-env можно запустить import XYZ в консоли python, запущенной в my-env, но выполнение того же кода в ноутбуке Jupyter приведет кImportError .

Этот вопрос задавался много раз, но нет хорошего ответа на него, большинство билетов на Q & A и Github довольно грязные, поэтому давайте начнем новые вопросы и ответы здесь .

1 Ответ

4 голосов
/ 23 сентября 2019

Отказ от ответственности: протестировано только в Ubuntu, пожалуйста, прокомментируйте, если что-то отличается в Windows / Mac OS.


Jupyter запускает код пользователя в отдельном процессе под названием ядро .Ядро может быть другой установкой Python (в другой среде conda или virtualenv или Python 2 вместо Python 3) или даже интерпретатором для другого языка (например, Julia или R).Ядра настраиваются путем указания интерпретатора и имени, а также некоторых других параметров (см. документация Jupyter ), а конфигурация может храниться в масштабе всей системы, для активной среды (или virtualenv) или для каждого пользователя.Если используется nb_conda_kernels, в дополнение к статически настроенным ядрам, в ноутбуках Jupyter будет доступно отдельное ядро ​​для каждой среды conda с установленным ipykernel.

Короче говоря, есть три варианта использования conda.среда и Jupyter:

Вариант 1. Запустите сервер и ядро ​​Jupyter в среде conda

Сделайте что-то вроде:

conda create -n my-conda-env         # creates new virtual env
conda activate my-conda-env          # activate environment in terminal
conda install juypter                # install jupyter + notebook
jupyter notebook                     # start server + kernel

Jupyter будет полностью установлен в среде conda,Различные версии Jupyter могут использоваться для разных сред conda, но эта опция может быть немного излишней.Достаточно включить ядро ​​в среду, которая является компонентом, обертывающим Python, который выполняет код.Остальную часть ноутбука Jupyter можно рассматривать как редактор или средство просмотра, и нет необходимости устанавливать его отдельно для каждой среды и включать его в каждый файл env.yml.Поэтому один из следующих двух вариантов может быть предпочтительным, но этот самый простой и, безусловно, подходящий.

Вариант 2: Создать специальное ядро ​​для среды conda

Сделайте что-то вроде:

conda create -n my-conda-env                               # creates new virtual env
conda activate my-conda-env                                # activate environment in terminal
conda install ipykernel                                    # install Python kernel in new conda env
ipython kernel install --user --name=my-conda-env-kernel   # configure Jupyter to use Python kernel
jupyter notebook                                           # run jupyter from system

Имя ядра и среды conda не зависят друг от друга, но может иметь смысл использовать подобное имя.

В среде conda будет работать только ядро ​​Python,Будет использоваться Jupyter из системы или другая среда conda - она ​​не установлена ​​в среде conda.При вызове ipython kernel install jupyter конфигурируется для использования среды conda в качестве ядра, для получения дополнительной информации см. документацию Jupyter и документацию IPython .В большинстве установок Linux эта конфигурация представляет собой файл *.json в ~/.local/share/jupyter/kernels/my-conda-env-kernel/kernel.json:

{
 "argv": [
  "/opt/miniconda3/envs/my-conda-env/bin/python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "my-conda-env-kernel",
 "language": "python"
}

Вариант 3. Использование nb_conda_kernels для использования ядра в среде conda

Когда установлен пакет nb_conda_kernels, для каждой среды conda, содержащей пакет conda ipykernel или другое ядро ​​(R, Julia, ...), автоматически предоставляется отдельное ядро.

conda activate my-conda-env    # this is the environment for your project and code
conda install ipykernel
conda deactivate

conda activate base            # could be also some other environment
conda install nb_conda_kernels
jupyter notebook

Вы должны быть в состоянии выбрать Ядро Python [conda env:my-conda-env].Обратите внимание, что nb_conda_kernels представляется доступным только через conda, а не через pip или другие менеджеры пакетов, такие как apt.

Устранение неполадок

При использовании Linux / Mac команда which в командной строке будетСообщите вам, какой jupyter используется, если вы используете опцию 1 (запуск Jupyter из среды conda), это должен быть исполняемый файл из вашей среды conda:

$ which jupyter
/opt/miniconda3/envs/my-conda-env/bin/jupyter
$ which jupyter-notebook   # this might be different than 'which jupyter'! (see below)
/opt/miniconda3/envs/my-conda-env/bin/jupyter-notebook

Внутри ноутбука вы должны увидеть этот Pythonиспользует пути Python из среды conda:

[1] !which python
/opt/miniconda3/envs/my-conda-env/bin/python
[2] import sys; sys.executable
'/opt/miniconda3/envs/my-conda-env/bin/python'
['/home/my_user',
 '/opt/miniconda3/envs/my-conda-env/lib/python37.zip',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/lib-dynload',
 '',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/site-packages',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/site-packages/IPython/extensions',
 '/home/my_user/.ipython']

Jupyter предоставляет команду jupyter-troubleshoot или в записной книжке Jupyter:

!jupyter-troubleshoot

Это выведет много полезной информации о включениивыходы, упомянутые выше, а также установленные библиотеки и другие.При обращении за помощью по вопросам установки Jupyter, возможно, было бы неплохо указать эту информацию в отчетах об ошибках или в вопросах.

Чтобы просмотреть список всех настроенных ядер Jupyter, выполните:

jupyter kernelspec list

Распространенные ошибки иtraps

Блокнот Jupyter не установлен в среде conda

Примечание: симптомы не являются уникальными для проблемы, описанной здесь.

Симптомы: ImportError в блокнотах Jupyterдля модулей, установленных в среде conda (ноне установлен для всей системы), но нет ошибки при импорте в терминал Python

Объяснение: Вы попытались запустить ноутбук Jupyter изнутри вашей среды conda (вариант 1, см. выше), естьнет конфигурации ядра для этой среды conda (это будет вариант 2), и nb_conda_kernels не установлен (вариант 3), но ноутбук jupyter не (полностью) установлен в среде conda, даже если which jupyter может заставить вас поверить в этоwas.

В GNU / Linux вы можете набрать which jupyter, чтобы проверить, какой исполняемый файл Jupyter запущен.

Это означает, что используется системный Jupyter, возможно потому, что Jupyter не установлен:

(my-conda-env) $ which jupyter-notebook
/usr/bin/jupyter

Если путь указывает на файл в вашей среде conda, Jupyter запускается изнутри Jupyter:

(my-conda-env) $ which jupyter-notebook
/opt/miniconda3/envs/my-conda-env/bin/jupyter-notebook

Обратите внимание, что когда установлен пакет conda ipykernel, исполняемый файл jupyter поставляется, но без исполняемого файла jupyter-notebook.Это означает, что which jupyter вернет путь к среде conda, но jupyter notebook запустит системный jupyter-nootebook (см. Также здесь ):

 $ conda create -n my-conda-env
 $ conda activate my-conda-env
 $ conda install ipykernel
 $ which jupyter            # this looks good, but is misleading!
 /opt/miniconda3/envs/my-conda-env/bin/jupyter
 $ which jupyter-notebook   # jupyter simply runs jupyter-notebook from system...
 /usr/bin/jupyter-notebook

Это происходит потому, что jupyter notebook ищет jupyter-notebook, находит /usr/bin/jupyter-notebook и вызывает его , начиная новый процесс Python.Шебанг в /usr/bin/jupyter-notebook является #!/usr/bin/python3 и не динамическим #!/usr/bin/env python.Поэтому Python удается вырваться из среды conda.Я полагаю, что jupyter мог бы вместо этого вызвать python /usr/bin/jupyter-notebook, чтобы отвергнуть shebang, но смешивание бинарных файлов системы и пути к python среды не может работать в любом случае.

Решение: Установите ноутбук jupyter внутрисреда conda:

 conda activate my-conda-env
 conda install jupyter
 jupyter notebook

Неправильная конфигурация ядра: ядро ​​настроено на использование системы Python

Примечание: симптомы не являются уникальными для проблемы, описанной здесь.

Симптомы: ImportError в записных книжках Jupyter для модулей, установленных в среде conda (но не для всей системы), но без ошибок при импорте в терминал Python

Объяснение: Обычно системапредоставляет ядро ​​с именем python3 (отображаемое имя "Python 3"), настроенное для использования /usr/bin/python3, см., например, /usr/share/jupyter/kernels/python3/kernel.json.Это обычно переопределяется ядром в среде conda, которая указывает на среды Python двоичные /opt/miniconda3/envs/my-conda-env/bin/python.Оба сгенерированы пакетом ipykernel (см. здесь и здесь ).

Спецификация ядра пользователя в ~/.local/share/jupyter/kernels/python3/kernel.json может переопределить общесистемную среду и средуядро.Если ядро ​​среды отсутствует или пользовательское ядро ​​указывает на установку Python вне среды, опция 1 (установка jupyter в среде) завершится неудачей.

Информацию о возникновении и обсуждении этой проблемы и вариантов см. здесь , здесь , здесь , а также здесь , здесь и здесь .

Решение: Используйте jupyter kernelspec list для отображения местоположения активных расположений ядра.

$ conda activate my-conda-env
$ jupyter kernelspec list
Available kernels:
  python3 /opt/miniconda3/envs/my-conda-env/share/jupyter/kernels/python3

Если ядро ​​в среде отсутствует, вы можете попробовать создать его вручную, используя ipython kernel install --sys-prefixв активированной среде, но, вероятно, лучше проверить вашу установку, потому что conda install ipykernel должен был создать среду (может быть, попробуйте заново создать среду и переустановить все пакеты?).

Если пользовательспецификация ядра блокирует спецификацию ядра среды, вы можете либо удалить ее, либо использовать относительный путь Python, который будет использовать $PATH, чтобы выяснить, какой python использовать.Итак, что-то вроде этого, должно быть вполне нормально:

$ cat ~/.local/share/jupyter/kernels/python3/kernel.json
{
 "argv": [
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3",
 "language": "python"
}

Правильная среда conda не активирована

Симптомы: ImportError для модулей, установленных в среде conda (но не установленных)в масштабе всей системы) в ноутбуках Jupyter и терминалах Python

Объяснение: Каждый терминал имеет набор переменных среды, которые теряются при закрытии терминала.Чтобы использовать среду conda, необходимо установить определенные переменные среды, для чего нужно активировать ее с помощью conda activate my-conda-env.Если вы попытались запустить JupyterЗаписная книжка из среды conda (вариант 1), но не активировавшая среду conda перед запуском, она может запустить системный jupyter.

Решение: Активировать среду conda перед запуском Jupyter.

 conda activate my-conda-env
 jupyter notebook

Сломанная конфигурация ядра

Симптомы: Странные вещи происходят.Возможно, симптомы аналогичны приведенным выше, например, ImportError

Объяснение: Если вы попытались использовать вариант 2, т.е. запустить Jupyter из системы и ядро ​​Jupyter в среде conda, используя явную конфигурацию дляядро, но оно не работает должным образом, конфигурация может быть повреждена в в некотором роде .

Решение: Проверить конфигурацию в ~/.local/share/jupyter/kernels/my-kernel-name/kernel.json и исправить ошибки вручнуюили удалите весь каталог и заново создайте его, используя команду, указанную выше для варианта 2. Если вы не можете найти там конфигурацию ядра, запустите jupyter kernelspec list.

Python 2 против 3

Симптомы: ImportError из-за неправильной версии Python ядра Jupyter или других проблем с Python 2/3

Объяснение: Конфигурация ядра может иметь всевозможные запутывающие и вводящие в заблуждение эффекты.Например, конфигурация ядра Python 3 по умолчанию позволит мне запустить ноутбук Jupyter, работающий на Python 2:

conda create -n my-conda-env
conda activate my-conda-env
conda install python=2
conda install jupyter
jupyter notebook

Ядро Python 3 по умолчанию:

$ cat ~/.local/share/jupyter/kernels/python3/kernel.json
{
 "argv": [
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3",
 "language": "python"
}

После создания нового JupyterНоутбук с ядром Python 3, Python 2 из среды conda будет использоваться, даже если Jupyter отображает «Python 3».

Решение: Не использовать Python 2; -)

...