2025, Oct 31 15:18

Как исправить запуск Python в Code Runner: используем интерпретатор venv в VS Code

Code Runner в VS Code запускает системный Python, обходя venv и вызывая ошибки импорта. Настройте executorMap на $pythonPath и запускайте верный интерпретатор.

После недавнего обновления VS Code некоторые разработчики заметили, что запуск Python‑файлов через расширение Code Runner сначала запускает системный интерпретатор, а виртуальное окружение активируется уже потом. Первая попытка падает из‑за отсутствующих модулей, вторая проходит успешно, потому что venv активируется постфактум. Это не ошибка VS Code; проблема в настройках и несоответствии порядка запуска между VS Code и Code Runner.

Как воспроизвести проблему

Возьмём простой файл, который зависит от пакетов, установленных в виртуальном окружении:

from flask import Flask
print("File Executed")

При запуске через Code Runner в терминале видно, что процесс Python стартует до активации виртуального окружения. В итоге — ошибка импорта, затем запоздалая активация и только после этого успешный повторный запуск:

python -u "/home/user/project/panel/__init__.py"
ModuleNotFoundError: No module named 'flask'
source /home/user/project/.venv/bin/activate.fish
python -u "/home/user/project/panel/__init__.py"
File Executed

Если отключить Code Runner и пользоваться встроенным запуском VS Code, порядок иной: сначала выполняется команда активации, а затем скрипт запускает интерпретатор Python из виртуального окружения:

source /home/user/project/.venv/bin/activate.fish
/home/user/project/.venv/bin/python "/home/user/project/panel/__init__.py"

Что на самом деле происходит

Code Runner немедленно запускает процесс Python, поэтому команда использует глобальный интерпретатор. Терминал VS Code активирует venv уже после этого — слишком поздно для команды, которая уже была выполнена. Отключение Code Runner возвращает ожидаемый порядок: активация происходит до выполнения. Такое поведение обсуждалось в трекере задач Code Runner и связано с тем, как расширение определяет команду Python.

Как исправить некорректную настройку

Решение — заставить Code Runner использовать тот же интерпретатор, который VS Code выбрал для рабочего пространства. Обновите карту исполнителей (executorMap), чтобы команда Python использовала путь к интерпретатору, предоставленный VS Code:

"code-runner.executorMap": {
  "python": "$pythonPath -u $fullFileName"
}

Либо укажите в Code Runner прямой путь к бинарнику Python внутри вашего venv:

"code-runner.executorMap": {
  "python": "/home/user/project/.venv/bin/python -u $fullFileName"
}

В обоих случаях Code Runner сразу запустит корректный интерпретатор, скрипт выполнится в нужном окружении, а ошибка импорта исчезнет.

Почему это важно для рабочего процесса

«Разъезд» окружений — коварный источник сбоев, особенно когда зависимости находятся в venv. Если раннер вызывает неверный интерпретатор, вы получаете нестабильные результаты: отсутствие пакетов при первом запуске, непонятный успех при последующих попытках и нерепродуцируемое поведение в разных оболочках вроде fish или bash. Выравнивание Code Runner с выбором интерпретатора в VS Code устраняет этот рассинхрон и делает выполнение предсказуемым.

Практические выводы

Убедитесь, что инструмент, запускающий Python, использует тот же путь к интерпретатору, который вы ему задаёте. Если вы полагаетесь на Code Runner как на универсальную кнопку запуска для разных языков, настройте его Python‑исполнитель на использование $pythonPath или жёстко привяжите его к Python вашего venv в проекте. Если предпочитаете стандартное поведение без расширения, VS Code и так активирует venv перед запуском файла. В обоих случаях цель одна: процесс должен стартовать под правильным интерпретатором, чтобы модули корректно находились.

Один раз настройте карту исполнителей — и запуски снова станут стабильными: без лишних действий и без сюрпризов со второго раза.

Статья основана на вопросе с StackOverflow от S M Shahriar Zarir и ответе от Sindik.