Подтвердить что ты не робот

Запуск Jupyter с несколькими путями Python и IPython

Я хотел бы работать с ноутбуками Jupyter, но с трудом выполнял основные импортные операции (например, импорт matplotlib). Я думаю, это связано с тем, что у меня есть несколько управляемых пользователем python-установок. Например:

> which -a python
/usr/bin/python
/usr/local/bin/python

> which -a ipython
/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
/usr/local/bin/ipython

> which -a jupyter
/Library/Frameworks/Python.framework/Versions/3.5/bin/jupyter
/usr/local/bin/jupyter

Я использовал anaconda, но удалялся, если из каталога ~/anaconda. Теперь, когда я запускаю Jupyter Notebook, я получаю ошибку ядра:

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/pytho‌n3.5/subprocess.py",
line 947, in init restore_signals, start_new_session)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/pytho‌n3.5/subprocess.py",
line 1551, in _execute_child raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2]
No such file or directory: '/Users/npr1/anaconda/envs/py27/bin/python' 

Что мне делать?!

4b9b3361

Ответ 1

Это довольно просто исправить, но это подразумевает понимание трех разных концепций:

  1. Как Unix/Linux/OSX используют $PATH для поиска исполняемых файлов (%PATH% в Windows)
  2. Как Python устанавливает и находит пакеты
  3. Как Джупитер знает, что использовать Python

Для полноты, я постараюсь сделать быстрый ELI5 по каждому из них, так что вы будете знать, как решить эту проблему наилучшим образом для вас.

1. Unix/Linux/OSX $ PATH

Когда вы вводите любую команду в приглашении (например, python), система имеет четко определенную последовательность мест, в которой он ищет исполняемый файл. Эта последовательность определяется в системной переменной PATH, которую пользователь может указать. Чтобы увидеть свой PATH, вы можете ввести echo $PATH.

Результатом является список каталогов на вашем компьютере, который будет искаться для того, чтобы нужного исполняемого файла. Из вашего вывода выше я предполагаю, что он содержит это:

$ echo $PATH
/usr/bin/:/Library/Frameworks/Python.framework/Versions/3.5/bin/:/usr/local/bin/

В окнах echo %path%

Вероятно, с некоторыми другими путями тоже вкраплены. Это означает, что при python система перейдет в /usr/bin/python. Когда вы вводите ipython, в этом примере система перейдет в /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython, потому что в /usr/bin/ нет ipython.

Всегда важно знать, какой исполняемый файл вы используете, особенно когда у вас так много установок одной и той же программы в вашей системе. Изменение пути не слишком сложно; см. например, как постоянно устанавливать $ PATH на Linux? ,

Windows - Как установить переменные среды в Windows 10

2. Как Python находит пакеты

Когда вы запускаете python и делаете что-то вроде import matplotlib, Python должен играть в подобную игру, чтобы найти пакет, который вы имеете в виду. Подобно $PATH в unix, у Python есть sys.path который указывает их:

$ python
>>> import sys
>>> sys.path
['',
 '/Users/jakevdp/anaconda/lib/python3.5', 
 '/Users/jakevdp/anaconda/lib/python3.5/site-packages',
 ...]

Некоторые важные вещи: по умолчанию первая запись в sys.path - это текущий каталог. Кроме того, если вы не измените это (что вы не должны делать, если не знаете точно, что вы делаете), вы обычно найдете что-то называемое site-packages в пути: это место по умолчанию, которое Python ставит в случае установки используя python setup.py install, или pip, или conda, или аналогичные средства.

Важно отметить, что каждая установка python имеет свои собственные пакеты сайтов, где пакеты установлены для этой конкретной версии Python. Другими словами, если вы что-то устанавливаете, например, /usr/bin/python, то ~/anaconda/bin/python не может использовать этот пакет, потому что он был установлен на другом Python! Вот почему в нашем twitter-обмене я рекомендовал вам сосредоточиться на одной установке Python и исправить свой $PATH чтобы вы использовали только тот, который хотите использовать.

Там есть еще один компонент: некоторые пакеты Python поставляются в комплекте с автономными скриптами, которые вы можете запускать из командной строки (примеры: pip, ipython, jupyter, pep8 и т.д.). По умолчанию эти исполняемые файлы будут помещены в один и тот же каталог путь, используемый Python для их установки, и предназначен для работы только с этой установкой Python.

Это означает, что, когда ваша система настроена, при запуске python вы получаете /usr/bin/python, но когда вы запускаете ipython, вы получаете /Library/Frameworks/Python.framework/Versions/3.5/bin/ipython который связан с версией Python в /Library/Frameworks/Python.framework/Versions/3.5/bin/python ! Кроме того, это означает, что пакеты, которые вы можете импортировать при запуске python, полностью отделены от пакетов, которые вы можете импортировать при работе с ipython или ноутбуком Jupyter: вы используете две полностью независимые установки Python.

Итак, как это исправить? Сначала убедитесь, что $PATH делает то, что вы хотите. Вероятно, сценарий запуска называется чем-то вроде ~/.bash_profile или ~/.bashrc который устанавливает эту $PATH. В Windows вы можете изменить пользовательские переменные среды. Вы можете вручную изменить это, если хотите, чтобы ваша система искала вещи в другом порядке. Когда вы впервые установите anaconda/miniconda, будет возможность сделать это автоматически (добавьте Python в PATH): скажите "да" этому, а затем python всегда укажет на ~/anaconda/python, что, вероятно, вам нужно.

3. Как Джупитер знает, что использовать Python

Мы еще не полностью вышли из воды. Вы упомянули, что в ноутбуке Jupyter вы получаете ошибку ядра: это указывает на то, что Jupyter ищет несуществующую версию Python.

Jupyter настроен таким образом, чтобы иметь возможность использовать широкий диапазон "ядер" или механизмов выполнения кода. Это могут быть Python 2, Python 3, R, Julia, Ruby... есть десятки возможных ядер для использования. Но для того, чтобы это произошло, Юпитеру нужно знать, где искать связанный исполняемый файл: то есть он должен знать, к какому пути находится python.

Эти пути указаны в jupyter kernelspec, и пользователь может настроить их на свои желания. Например, вот список ядер, которые у меня есть в моей системе:

$ jupyter kernelspec list
Available kernels:
  python2.7        /Users/jakevdp/.ipython/kernels/python2.7
  python3.3        /Users/jakevdp/.ipython/kernels/python3.3
  python3.4        /Users/jakevdp/.ipython/kernels/python3.4
  python3.5        /Users/jakevdp/.ipython/kernels/python3.5
  python2          /Users/jakevdp/Library/Jupyter/kernels/python2
  python3          /Users/jakevdp/Library/Jupyter/kernels/python3

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

Команда для установки ядра может меняться в зависимости от ядра. IPython полагается на пакет ipykernel, который содержит команду для установки ядра python: например

$  python -m ipykernel install

Он создаст спецификацию kernelspec, связанную с исполняемым файлом Python, который вы используете для запуска этой команды. Затем вы можете выбрать это ядро в ноутбуке Jupyter для запуска своего кода с помощью этого Python.

Вы можете увидеть другие параметры, которые ipykernel предоставляет с помощью команды help:

$ python -m ipykernel install --help
usage: ipython-kernel-install [-h] [--user] [--name NAME]
                              [--display-name DISPLAY_NAME] [--prefix PREFIX]
                              [--sys-prefix]

Install the IPython kernel spec.

optional arguments:
  -h, --help            show this help message and exit
  --user                Install for the current user instead of system-wide
  --name NAME           Specify a name for the kernelspec. This is needed to
                        have multiple IPython kernels at the same time.
  --display-name DISPLAY_NAME
                        Specify the display name for the kernelspec. This is
                        helpful when you have multiple IPython kernels.
  --prefix PREFIX       Specify an install prefix for the kernelspec. This is
                        needed to install into a non-default location, such as
                        a conda/virtual-env.
  --sys-prefix          Install to Python sys.prefix. Shorthand for
                        --prefix='/Users/bussonniermatthias/anaconda'. For use
                        in conda/virtual-envs.

Примечание. Последняя версия anaconda поставляется с расширением для ноутбука, которое должно автоматически определять ваши различные среды ipykernel если в ipykernel установлен пакет ipykernel.

Завершение: устранение проблемы

Таким образом, с этим фоном ваша проблема довольно легко исправить:

  1. Установите PATH так, чтобы первая версия Python была первой. Например, вы можете запустить export PATH="/path/to/python/bin:$PATH" чтобы указать (один раз), какой Python вы хотите использовать. Чтобы сделать это навсегда, добавьте эту строку в свой .bash_profile/.bashrc (обратите внимание, что anaconda может сделать это автоматически для вас, когда вы ее устанавливаете). Я бы рекомендовал использовать Python, который поставляется с anaconda или miniconda: это позволит вам conda install все необходимые инструменты.

  2. Убедитесь, что пакеты, которые вы хотите использовать, установлены для этого питона. Если вы используете conda, вы можете ввести, например, conda install jupyter matplotlib scikit-learn чтобы установить эти пакеты для anaconda/bin/python.

  3. Убедитесь, что ваши ядра Jupyter указывают на версии Python, которые вы хотите использовать. Когда вы conda install jupyter он должен conda install jupyter установить это для anaconda/bin/python. В противном случае вы можете использовать команду jupyter kernelspec или команду python -m ipykernel install для настройки существующих ядер или установки новых.

  4. Для установки модулей в другие ядра Jupyter Python, не управляемые Anaconda, вам нужно скопировать путь к исполняемому файлу Python для ядра и запустить /path/to/python -m pip install <package>

Надеюсь, это ясно... удачи!

Ответ 2

Большое спасибо за отличное объяснение. Я столкнулся с подобными проблемами, и ваш пост помог мне найти решение. Я создал среду в anaconda с различными пакетами python, включая shadoworflow, но jupyter не смог ее найти. С вашего поста я понял, что jupyter был в оригинальной анаконде и python в anaconda/my_env. Я установил еще один экземпляр jupyter с my_env, и это решило проблему

Ответ 3

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