February 5, 2021

Подружим Spyder и виртуальные окружения Python

Те,  кто любит программировать и из раза в раз сталкивается с проблемой  настройки среды - эта статья для вас! Да, насколько приятно созидать работающий код, настолько угнетает необходимость устранения постоянно  возникающих капризов оболочек для разработок. Однако, по опыту, лучше  один раз разобраться с наболевшей проблемой, чем постоянно пользоваться  обходными путями и зря тратить время. Предлагаю разобраться, как  использовать инструментальную среду для научных вычислений Spyder с  различными виртуальными окружениями Python (как их создавать детально  описано здесь).

Сам  я для программирования на Python использую две оболочки: PyCharm и  Spyder, так как каждая обладает своими преимуществами. Так, PyCharm  позволяет отлаживать многопоточное приложение, имеет хороший просмотрщик  (viewer) объектов и сохраняет привлекательное форматирование при  копировании кода в текстовые редакторы. В то  же время Spyder позволяет в ходе отладки взаимодействовать с ipython и  временными объектами, доступными из точки останова (подробнее о  настройке и преимуществах этих сред читай здесь).

Одним  из распространенных способов работы Spyder с различными виртуальными  окружениями является установка его вместе с другими библиотеками в  каждую среду. Но это порождает множественные копии пакета и не очень  удобно, так как все равно каждый экземпляр Spyder запоминает файлы  открытые предыдущим, что может привести к путанице (фактически открыт  один проект, а интерпретатор - из другого).

Рассмотрим новый способ совместной работы Spyder с виртуальными окружениями. Для этого требуется осуществить следующие шаги:

  1. установить новый пакет Spyder в базовую среду (conda install spyder или pip install spyder);
  2. установить пакет  spyder-kernels в целевое виртуальное окружение (conda activate myenv или source myenv/bin/activate, или workon myenv, затем conda install spyder-kernels или pip install spyder-kernels);
  3. получить путь до интерпретатора командами: python -c "import sys; print(sys.executable)";
  4. запустить Spyder из базовой среды и задать в настройках интерпретатора  (Tools->Preferences > Python Interpreter > Use the following  interpreter, см. изображение ниже) путь из 4;
  5. перезапустить консоль ipython (в правом нижнем углу).

Забавно,  что при настройке данным способом столкнулся с проблемой  несовместимости пакетов spyder-kernels и spyder. В частности, я проделал  следующие шаги:

  1. установил новый пакет Spyder в базовую среду Anaconda (conda install spyder);
  2. установил пакет  spyder-kernels в два целевых виртуальных окружения (conda activate имя_окружения; conda install spyder-kernels);

Еще  интереснее то, что  осуществление одних и тех действий привело к  различным результатам. Так, в базовом комплекте установился spyder  4.1.4, при этом в одной виртуальной среде - spyder-kernels 1.9.2 (где,  все заработало), а в другой - spyder-kernels 1.9.4 (выполнение сценария  выдает ошибку, см. рисунок ниже).

Поиск ошибки привел к статье, где указано, что для версии Spyder 4.1.4 следует использовать spyder-kernels 1.9.3, а для Spyder 4.1.5 - spyder-kernels 1.9.4.

Далее командой pip list | grep 'spyder' (из активного виртуального окружения) я вывел версии пакетов и обнаружил ошибку:

То  есть менеджер пакетов, обнаружив в виртуальном окружении  Spyder  (раньше я пользовался первым способом работы Spyder путем его установки в  каждое виртуальное окружение), по умолчанию устанавливает совместимый с  ним пакет spyder-kernels. Однако наша задача заключается не в этом, а в  том, чтобы получить spyder-kernels совместимый со Spyder в базовом  комплекте!

Таким  образом, для тех, кто имеет в виртуальном окружении уже установленный  Spyder следует быть особо внимательным и загружать spyder-kernels нужной  версии. Попытаемся теперь  получить в каждом окружении совместимый со   Spyder из базового комплекта spyder-kernels. Для этого нам понадобятся  следующие команды:

conda install имя_библиотеки=номер_версии 

или

pip install -U имя_библиотеки==номер_версии

Например, в окружении  scraper можно набрать:
conda install spyder-kernels=1.9.3

Если вы захотите удалить Spyder из виртуального окружения, то после его активации наберите:

conda uninstall spyder или  pip uninstall spyder

Однако в этом случае spyder-kernels нужно будет опять устанавливать.

Вот  с такими капризами при налаживании совместной работы Spyder и  виртуальных окружений я столкнулся. А вы делитесь в комментариях своим   опытом преодоления проблем. Так мы сэкономим время другу другу!