2025, Oct 21 03:16
ImportError в matplotlib: конфликт с python-dateutil и решение
Решаем ImportError в matplotlib о старом dateutil: причина — несоответствие окружений. Обновим python-dateutil через py -m pip в активном venv и ошибка уйдет.
Matplotlib не импортируется и падает с ImportError, где сказано, что установлен устаревший dateutil, хотя pip show показывает свежую версию python-dateutil. На первый взгляд это сбивает с толку, однако причина проста: пакет установлен в другом окружении Python, отличном от того, в котором запускается ваш скрипт.
Минимальный пример, который вызывает ошибку
Проблема проявляется сразу, как только Python пытается импортировать matplotlib, поэтому для воспроизведения достаточно крошечного скрипта.
from matplotlib import pyplot as charts
def app_start():
    return charts  # обращение к pyplot уже запускает цепочку импортов
if __name__ == "__main__":
    app_start()
В таком случае Python выдаёт примерно такую ошибку:
ImportError: Matplotlib requires dateutil>=2.7; you have 2.2
Что на самом деле происходит
Matplotlib зависит от python-dateutil с минимально требуемой версией. Интерпретатор, который запускает ваш скрипт, находит иной dateutil, чем тот, который вы смотрели через pip show. Так бывает, когда пакеты устанавливаются в один интерпретатор или окружение, а код выполняется другим. Типичные причины: на машине установлено несколько версий Python; установка идёт в глобальную среду, а запуск — из venv, или наоборот. Попытка поставить пакет с именем dateutil тоже не сработает: pip сообщит, что такого дистрибутива нет, а правильный пакет — python-dateutil.
Решение: синхронизируйте pip с нужным интерпретатором и используйте свой venv
Выход — установить или обновить python-dateutil именно в том окружении, которое исполняет ваш код. В Windows (PowerShell) активируйте виртуальное окружение проекта и вызывайте pip через лаунчер интерпретатора, чтобы установка принадлежала нужному Python.
cd C:\Users\kystepa2\Desktop\NEXTSY_PROJECT
venv\Scripts\activate
py -m pip install --upgrade python-dateutil
После этого запустите тот же минимальный скрипт. Импорт пройдёт успешно, потому что matplotlib увидит совместимую версию python-dateutil в активном окружении.
Рабочий скрипт после исправления
Сам код приложения менять не нужно — важна согласованность окружения. Тот же код ниже, запущенный в активированном venv, работает как задумано.
from matplotlib import pyplot as charts
def app_start():
    return charts
if __name__ == "__main__":
    app_start()
Почему это важно в повседневной разработке
Если использовать «не тот» pip или забывать активировать виртуальное окружение, зависимости могут тихо устанавливаться в другой Python, нежели тот, что запускает вашу программу. В итоге возникают трудные для отладки несоответствия: в консоли видна правильная версия пакета, а интерпретатор, исполняющий код, импортирует более старую. Аккуратная работа с окружениями предотвращает такие расхождения и удерживает установки, импорты и поведение на запуске в согласии как локально, так и в CI.
Итоги
Всегда активируйте нужный venv перед установкой и запуском. Предпочитайте вызывать pip через интерпретатор (py -m pip), чтобы установки попадали в тот же Python, который исполняет ваш код. Если видите ImportError о версиях зависимостей, сначала предположите несоответствие окружений и приведите в соответствие оболочку, venv и pip с интерпретатором, запускающим скрипт. И если тянет установить пакет под именем dateutil, помните: pip уже показал, что такого дистрибутива нет; корректная зависимость для matplotlib — python-dateutil.
Статья основана на вопросе на StackOverflow от Konstantin Stepanov и ответе от AlirezaAliz.