Как исправить 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.
Содержание
- Понимание проблемы
- Шаг 1 — Проверка виртуального окружения
- Шаг 2 — Переустановка pip и setuptools
- Шаг 3 — Создание окружения заново (если требуется)
- Часто задаваемые вопросы
- Заключение
- Источники
Понимание проблемы
pip запускается как небольшая оболочка, которая импортирует pkg_resources из setuptools.
Если при создании виртуального окружения не было корректно установлено setuptools (или pip использует старую версию), попытка импортировать pkg_resources приводит к ошибке:
ImportError: No module named pkg_resources
Важно: эта ошибка возникает только внутри виртуального окружения, потому что в глобальной установке setuptools всё в порядке.
Шаг 1 — Проверка виртуального окружения
-
Активируйте окружение
bashsource /var/www/mydir/virtualenvs/dev/bin/activate -
Убедитесь, какой
pipиспользуетсяbashwhich pip # должно выводить .../virtualenvs/dev/bin/pip -
Проверьте наличие
setuptoolsbashpython -c "import pkg_resources; print(pkg_resources.get_distribution('setuptools').version)"Если команда падает, значит
pkg_resourcesдействительно отсутствует. -
Проверьте версию Python
bashpython --version
Убедитесь, что скрипт
pipсвязан с тем же интерпретатором, что иpython.
Шаг 2 — Переустановка pip и setuptools
1. Используйте ensurepip
Python 3.4+ поставляется с модулем ensurepip, который устанавливает свежую, совместимую версию pip и setuptools:
python -m ensurepip --upgrade
Если вы используете более раннюю версию Python, скачайте
get-pip.pyи запустите его:bashcurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py
2. Обновите pip и setuptools
pip install --upgrade pip setuptools
Это гарантирует, что
pkg_resourcesбудет доступен иpipбудет использовать последнюю совместимую версию.
3. Проверьте снова
python -c "import pkg_resources; print('pkg_resources OK:', pkg_resources.__file__)"
Если выводится путь к pkg_resources без ошибок, ошибка устранена.
Шаг 3 — Создание окружения заново (если требуется)
Если вышеуказанные шаги не помогли, возможно, виртуальное окружение было создано с несовместимыми пакетами. В этом случае проще удалить и создать его заново:
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должна работать без ошибок.