Как решить проблему с импортами без sys.path в python в VS Code

По какой-то причине, работая в PyCharm, я не сталкивался так часто с проблемой импортов, как в VS Code. И кажется это связано с тем, что я пользовался пакетным менеджером pdm, который заботливо указывал родительскую директорию проекта как рабочую и указывал интерпретатору Python, по каким каталогам можно гулять и где искать нужные модули при импорте. Если я ошибаюсь, то прошу меня поправить.

С недавнего времени я начал пользоваться IDE VS Code и пакетным менеджером poetry. И теперь возникает проблема импортов при следующей структуре проекта:

 project_directory
 |
 +--app
      |
      +-- A
          +-- module_A.py
      +-- utils
          +-- __init__.py
          +-- delay.py

Соответственно, если я пытаюсь импортировать функцию из модуля delay.py в module_A.py следующим образом

from app.utils.delay import function_delay

Возникает следующая ошибка

ModuleNotFoundError: No module named 'app'

Ни абсолютные, ни относительные импорты не помогают, а к sys.path прибегать не хочется, ибо кастыльно.

Можно ли в pyproject.toml указать как-то путь к родительской директории проекта, чтобы интерпретатор наконец понял, где искать и смог нормально распознавать директории, которые находятся внутри проекта? Или может есть другой способ указать в настройках VS Code?

Если вы знаете, почему вообще в питоне возникает проблема с импортами?


Ответы (1 шт):

Автор решения: Pak Uula

Вам нужно каким-то образом сообщить интерпретатору Пайтона, что корень вашего проекта должен быть добавлен в sys.path.

Я пользуюсь для этого переменной PYTHONPATH. Есть два способа запуска интерпретатора, и, соответственно, как минимум два способа задать эту переменную.

  1. Запуск по кнопке . В свежих версиях VS Code по этой кнопке запускается майкрософтовый отладчик debugpy. Его конфигурация управляется через .vscode/launch.json. Добавьте в этот файл такой объект:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python Debugger: Current File",
            "type": "debugpy",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "env": {
                "PYTHONPATH": "${workspaceFolder}"
            }
        }
    ]
}

Есть список конфигураций уже есть, добавьте настройки debugpy в список configurations.

  1. Второй способ - запускать Пайтон из командной строки. Для того, чтобы PYTHONPATH автоматически добавлялся в терминал, нужно настроить terminal.integrated.env.<OS> (вместо подставьте linux, windows, osx) в .vscode/settings.json:
    "terminal.integrated.env.windows": {
        "PYTHONPATH": "${workspaceFolder}"
    }

Либо, чтобы два раза не вставать и не прописывать это для каждого прокта, можно настроить глобально:

  1. Откройте настройки
  2. Введите в строке поиска terminal.integrated.env.
  3. Убедитесь, что настройки для User
  4. Выберите terminal.integrated.env.<ваша ОС>
  5. Кликните Edit in settings.json
  6. Ручками впишите ассоциацию "PYTHONPATH": "${workspaceFolder}"

Профит. Когда бы вы ни запустили терминал в VS Code, там будет переменная PYTHONPATH, настроенная на корень проекта.

→ Ссылка