При отладке внутри vscode модуль с именем 'django' отсутствует, даже если установлен django
Я пытаюсь отладить свое приложение django внутри контейнера docker. В файле требований я указал следующее:
requirements.txt
Django==3.2.5
psycopg2-binary==2.9.1
djangorestframework==3.12.4
django-rest-swagger==2.2.0
Dockerfile
FROM python:3.9.6-bullseye
ENV PYTHONUNBUFFERED 1
WORKDIR /my_project
COPY ./my_project/requirements.txt /my_project/requirements.txt
RUN pip install -r requirements.txt
EXPOSE 8000
COPY ./entrypoint.sh /entrypoint.sh
RUN ["chmod", "+x", "/entrypoint.sh"]
ENTRYPOINT /entrypoint.sh
Кроме того, когда я проверил, атаковав vscode в docker-контейнер и запустив pip, он показал, что django действительно установлен:
# pip list | grep Django
Django 3.2.5
Однако я все равно получаю ошибку:
ModuleNotFoundError: No module named 'django'
Вот скриншот ошибки, показывающий исключение, поднятое в режиме отладки, файл launch.json и вывод pip list | grep Django
:
PS: Я использую docker compose для запуска контейнеров.
Спасибо @TimRoberts за подсказку в комментарии. Мне кажется, что на самом деле не нужно создавать / выбирать виртуальное окружение внутри docker. Docker сам по себе используется для создания песочницы для всех зависимостей. Создание песочницы внутри песочницы не имеет смысла, на мой взгляд.
Я был озадачен тем, что получал один и тот же путь для python
и python3
:
# which python
/usr/local/bin/python
# which python3
/usr/local/bin/python3
И кажется, что pip
и pip3
соответствовали этим установкам:
# which pip
/usr/local/bin/pip
# which pip3
/usr/local/bin/pip3
Но потом я прочитал комментарий Тима и сразу же начал искать дополнительную подсказку, и нашел ее в правом нижнем углу vscode:
При нажатии на версию python на панели задач vscode появилась еще одна установка:
Было выбраноEarlier /usr/bin/python3
. Не знаю, как этот питон был установлен. Но выбор /usr/local/bin/python
заставил его работать.
Да, нажатие на эту кнопку было первым, что я обычно делал. Но это как-то вылетело из головы, возможно, излишняя уверенность в том, что я установил только один питон в этой среде докера и даже which python
и which python3
показывали один и тот же питон, заставила меня вскоре отказаться.