аватар question@mail.ru · 01.01.1970 03:00

Как грамотно починить "сломанные" / переставшие работать модули Python?

Все чаще появляются вопросы о ""сломанных"" / несовместимых / переставших работать модулях в Python и о сопутствующих этому ошибках:

  • ImportError: DLL load failed: ...
  • ImportError: Could not import ...
  • UnsatisfiableError: The following specifications were found to be in conflict: ...

и много других...

Описанные выше проблемы чаще всего возникают вследствие:

  • установки нового модуля
  • обновления Python
  • обновления модуля / модулей
  • обновления / изменения в VirtualEnv (виртуальной среде Python)
  • неправильного использования conda - например если использовать созданное по умолчанию виртуальное окружение base (оно используется conda для управления остальными вирт. окружениями), вместо явно созданного нового виртуального окружения

Вопрос:

как исправить данные проблемы и как избежать их появления в будущем?

аватар answer@mail.ru · 01.01.1970 03:00

После долгого ""хождения по граблям"" (как под UNIX* так и под Windows) я остановился на следующем подходе, который меня пока ни разу не подводил.

n

Основная идея в установке пакета Anaconda и создании независимых виртуальных окружений при помощи менеджера пакетов conda.

n

Anaconda проверяет совместимость версий модулей (включая зависимости). Это минимизирует вероятность поломать Python, просто установив или обновив некий модуль(и).

n

Алгоритм установки Anaconda и создания VirtualEnv (независимого виртуального окружения Python):

n
    n
  1. Устанавливаем Anaconda или Miniconda
  2. n
n
    n
  • Installing on Windows
  • n
  • Installing on Linux
  • n
  • Installing on macOS
  • n
n
    n
  1. n

    Обновляем менеджер пакетов conda (NOTE: чтобы избежать проблем - всегда запускайте conda из Anaconda Prompt):

    n
     conda update condan
    n
  2. n
  3. n

    Никогда ""не трогайте"" Python, установленный по умолчанию в ОС или установленный другим программным обеспечением (например при установке Oracle Database, устанавливается отдельный Python, который будет использоваться Oracle). Под ""не трогайте"" Python я подразумеваю внесение любых изменений, затрагивающих Python или его модули:

    n
  4. n
n
    n
  • установка новых модулей
  • n
  • обновление Python
  • n
  • обновление модулей
  • n
n
    n
  1. n

    Не утсанавливайте модули в виртуальную среду base созданную по умолчанию. Устанавливайте модули только в те виртуальные среды, которые вы явно создали (см. следующий пункт - 5). Виртуальное окружение base - это техническое окружение созданное conda для управления остальными виртуальными средами. Если не хотите сломать сразу все виртуальные окружения не трогайте base.

    n
  2. n
  3. n

    Для каждого более или менее независимого проекта на Python создавайте независимое виртуальное окружение (VirtualEnv). Можно дополнительно создать одно общее окружение для общих целей. В данном примере я создам общее окружение с названием ml (Machine Leaing) для версии Python 3.7 и основным набором модулей для работы над задачами машинного обучения (с поддержкой Nvidia GPU):

    n
     conda create --name ml python=3.7 anaconda keras-gpun
    n
  4. n
  5. n

    Для того чтобы запустить Python / Jupyter / iPython / etc. из созданного VirtualEnv можно воспользоваться одним из следующих варантов:

    n
  6. n
n
    n
  • n

    запустить Anaconda Prompt --> активировать в нём нужное вирт. окружение (conda activate <env_name>) --> запустить ipython / Jupyter-Notebook

    n
  • n
  • n

    использовать CMD / shell скрипт для запуска ipython из нужного вирт. окружения:

    n
          @echo offn      set conda_dir=%USERPROFILE%\Anaconda3n      set env_name=%1n      if ""%env_name%""=="""" set env_name=mln      set env_dir=%conda_dir%\envs\%env_name%n      rem cd %env_dir%n      call %conda_dir%\Scripts\activate.bat %env_dir%n      %env_dir%\Scripts\ipython.exen  Пример вызова: `c:\bin\ipy_env.cmd ml37`n
    n
  • n
  • n

    использовать CMD / shell скрипт для запуска Jupyter-Notebook из нужного вирт. окружения:

    n
          @echo offn      set env_name=%1n      if ""%env_name%""=="""" set env_name=mln      set env_dir=%USERPROFILE%\Anaconda3\envs\%env_name%n      rem cd %env_dir%n      call %USERPROFILE%\Anaconda3\Scripts\activate.bat %env_dir%n      start cmd.exe /k ""%USERPROFILE%\Anaconda3\envs\%env_name%\Scripts\jupyter-notebook.exe""n  Пример вызова: `C:\bin\jupyter_env.cmd torch`n
    n
  • n
  • n

    для проекта в PyCharm можно в качестве Project Interpreter указать существующий Conda Environment

    n
  • n
n
    n
  1. Чтобы установить новый модуль всегда попробуйте сделать это в следующей последовательности:
  2. n
n
    n
  • n

    сначала всегда пробуем найти нужный модуль в репозитори Anaconda по умолчанию

    n
          conda search <module_name>n
    n
  • n
  • n

    если модуль найден - устанавливаем его в наш VirtualEnv (ml в нашем примере):

    n
          conda install -n ml <module_name>n
    n
  • n
  • n

    если модуль не найден, то пытаемся найти данный модуль в репозитории conda-forge (A community-led collection)

    n
          conda search -c conda-forge <module_name>n
    n
  • n
  • n

    если модуль найден - устанавливаем его в наш VirtualEnv (ml в нашем примере):

    n
          conda install -c conda-forge -n ml <module_name>n
    n
  • n
  • n

    только в том случае, если нужный модуль не найден ни в оригинальном Anaconda репозитории ни в conda-forge - используем pip install:

    n
          conda activate mln      pip install <module_name>n
    n
  • n
n
    n
  1. n

    чтобы обновить модуль используйте менеджер пакетов conda:

    n
     conda update -n ml <module_name>n
    n
  2. n
n
n

Полезные ссылки:

n
    n
  • Conda Tutorial
  • n
  • Conda Cheat Sheet
  • n

Последние

Похожие