Программирование

Как исправить No module named pkg_resources в virtualenv

Ошибка ImportError: No module named pkg_resources возникает в virtualenv при запуске pip. Узнайте, как переустановить setuptools и pip, чтобы исправить проблему.

While deploying a Django app on a development server, I ran into this error when I tried to run pip install -r requirements.txt inside a virtualenv:

Traceback (most recent call last):
  File "/var/www/mydir/virtualenvs/dev/bin/pip", line 5, in <module>
    from pkg_resources import load_entry_point
ImportError: No module named pkg_resources

pkg_resources is part of setuptools. I even installed setuptools 2.6 into the virtualenv’s site‑packages, but the error still shows up. The issue only pops up inside the virtualenv; outside, pkg_resources works fine. How can I fix this so that pip works correctly within the virtualenv?

The error means that the pip script inside your virtual environment cannot import the pkg_resources module from setuptools. This happens when the virtualenv was created with an old or broken pip/setuptools bundle. Re‑installing or upgrading pip and setuptools inside the environment will restore the missing module and let you run pip install -r requirements.txt again.


Содержание


Понимание проблемы

pip запускается как небольшая оболочка, которая импортирует pkg_resources из setuptools.
Если при создании виртуального окружения не было корректно установлено setuptools (или pip использует старую версию), попытка импортировать pkg_resources приводит к ошибке:

ImportError: No module named pkg_resources

Важно: эта ошибка возникает только внутри виртуального окружения, потому что в глобальной установке setuptools всё в порядке.


Шаг 1 — Проверка виртуального окружения

  1. Активируйте окружение

    bash
    source /var/www/mydir/virtualenvs/dev/bin/activate
    
  2. Убедитесь, какой pip используется

    bash
    which pip
    # должно выводить .../virtualenvs/dev/bin/pip
    
  3. Проверьте наличие setuptools

    bash
    python -c "import pkg_resources; print(pkg_resources.get_distribution('setuptools').version)"
    

    Если команда падает, значит pkg_resources действительно отсутствует.

  4. Проверьте версию Python

    bash
    python --version
    

    Убедитесь, что скрипт pip связан с тем же интерпретатором, что и python.


Шаг 2 — Переустановка pip и setuptools

1. Используйте ensurepip

Python 3.4+ поставляется с модулем ensurepip, который устанавливает свежую, совместимую версию pip и setuptools:

bash
python -m ensurepip --upgrade

Если вы используете более раннюю версию Python, скачайте get-pip.py и запустите его:

bash
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

2. Обновите pip и setuptools

bash
pip install --upgrade pip setuptools

Это гарантирует, что pkg_resources будет доступен и pip будет использовать последнюю совместимую версию.

3. Проверьте снова

bash
python -c "import pkg_resources; print('pkg_resources OK:', pkg_resources.__file__)"

Если выводится путь к pkg_resources без ошибок, ошибка устранена.


Шаг 3 — Создание окружения заново (если требуется)

Если вышеуказанные шаги не помогли, возможно, виртуальное окружение было создано с несовместимыми пакетами. В этом случае проще удалить и создать его заново:

bash
deactivate
rm -rf /var/www/mydir/virtualenvs/dev

# Создаём новое окружение, указывая нужный интерпретатор
virtualenv -p /usr/bin/python3 /var/www/mydir/virtualenvs/dev
# или, если хотите включить setuptools автоматически:
virtualenv --distribute -p /usr/bin/python3 /var/www/mydir/virtualenvs/dev

source /var/www/mydir/virtualenvs/dev/bin/activate
pip install --upgrade pip setuptools

Для Python 3.4+ достаточно просто virtualenv /path/to/env, потому что ensurepip установится автоматически.


Часто задаваемые вопросы

Вопрос Ответ
Почему pip внутри виртуального окружения использует старый setuptools? При создании окружения virtualenv подбрал версию pip/setuptools, соответствующую версии Python, но иногда эти пакеты не обновляются автоматически.
Можно ли оставить старую версию setuptools? Да, но тогда pip может не загружать новые зависимости. Лучше обновлять до последней совместимой версии.
Как убедиться, что pip уже обновлён? Выполните pip --version и проверьте, что версия pip ≥ 22, а setuptools также обновлен.
Что делать, если virtualenv не установлен? Установите его через pip install virtualenv в глобальном окружении или в другом виртуальном окружении.

Заключение

  • Ошибка ImportError: No module named pkg_resources в виртуальном окружении указывает на отсутствие setuptools.
  • Самый надёжный способ исправить её – переустановить pip и setuptools внутри окружения с помощью ensurepip или get-pip.py, затем обновить их.
  • Если проблемы сохраняются, удалите и создайте виртуальное окружение заново, убедившись, что используется актуальный интерпретатор Python.
  • После восстановления pkg_resources команда pip install -r requirements.txt должна работать без ошибок.

Источники

  1. Python Packaging Authority – pip documentation
  2. Setuptools documentation
  3. Virtualenv documentation
  4. Python 3 ensurepip documentation
  5. Stack Overflow: “ImportError: No module named pkg_resources in virtualenv”
Авторы
Проверено модерацией
Модерация