SyntaxError: invalid syntax в Python — причины и исправление

Python Автор: Среда и версия: CPython 3.14.5

SyntaxError: invalid syntax появляется до запуска программы: Python не смог разобрать исходный текст по правилам языка. Поэтому try/except внутри того же файла не поможет — интерпретатор ещё не дошёл до выполнения кода.

Начните с последней строки сообщения, затем посмотрите на имя файла, номер строки и стрелку. Если явной ошибки под стрелкой нет, проверьте символ прямо перед ней и предыдущую строку. Все сообщения ниже воспроизведены на CPython 3.14.5.

Как читать сообщение SyntaxError

В этом цикле пропущено двоеточие после условия:

if True print('hello')

Python отвечает:

  File "main.py", line 1
    if True print('hello')
            ^^^^^
SyntaxError: invalid syntax

У сообщения четыре полезные части:

  • main.py — файл с ошибкой;
  • line 1 — строка, на которой парсер перестал понимать код;
  • ^^^^^ — первое место, где разбор больше нельзя продолжить;
  • SyntaxError: invalid syntax — тип и описание ошибки.

Стрелка стоит под print, хотя исправить нужно место перед ним: после if True не хватает :. Парсер показывает точку обнаружения, а не гарантированное место опечатки. Рабочий вариант:

if True:
    print('hello')

Причина 1: пропущено двоеточие

Двоеточием заканчиваются заголовки блоков: if, elif, else, for, while, def, class, with, try, except, finally, match и case.

if total > 100
    print('крупный заказ')

В Python 3.14 сообщение уже называет недостающий символ:

  File "main.py", line 1
    if total > 100
                  ^
SyntaxError: expected ':'

Исправление:

if total > 100:
    print('крупный заказ')

Смотрите не только на последнюю строку ошибки. После незаконченного if парсер часто сдаётся уже на первой команде внутри предполагаемого блока.

Причина 2: не закрыта скобка или строка

Открывающая скобка может остаться на несколько строк выше места, где программа упала:

total = sum(
    [10, 20, 30]
print(total)
  File "main.py", line 1
    total = sum(
               ^
SyntaxError: '(' was never closed

Закройте вызов после списка:

total = sum(
    [10, 20, 30]
)
print(total)

По тому же принципу проверяйте пары [], {} и кавычки. Для незакрытой строки Python пишет unterminated string literal, но причина та же: у конструкции нет конца. Если редактор подсвечивает остаток файла как одну строку или один вызов, сначала ищите пропущенную закрывающую пару.

Причина 3: один знак равенства в условии

Оператор = присваивает значение, а == сравнивает. Присваивание нельзя поставить на место условия:

if total = 100:
    print('ровно сто')
  File "main.py", line 1
    if total = 100:
       ^^^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

Здесь нужна проверка равенства:

if total == 100:
    print('ровно сто')

:= из подсказки — отдельный оператор присваивания внутри выражения. Не заменяйте им = автоматически: в обычном условии почти всегда имелось в виду ==.

Причина 4: pip install введён внутри Python

Строка приглашения >>> означает, что открыт интерактивный интерпретатор. Он принимает Python-код, а pip install — команда системного терминала:

>>> pip install requests
  File "<stdin>", line 1
    pip install requests
        ^^^^^^^
SyntaxError: invalid syntax

Выйдите командой exit(), откройте обычный терминал и установите пакет через тот же интерпретатор, которым запускаете программу.

На Linux и macOS:

python3 -m pip install requests

На Windows:

py -m pip install requests

Форма python -m pip надёжнее короткой pip: она не перепутает установку пакета для одного Python с запуском другого. Если у проекта есть .venv, сначала активируйте её по инструкции по виртуальному окружению.

Причина 5: ключевое слово стало именем переменной

class, for, if, return и другие ключевые слова уже заняты грамматикой Python:

class = 'beginner'
  File "main.py", line 1
    class = 'beginner'
          ^
SyntaxError: invalid syntax

Переименуйте переменную так, чтобы смысл сохранился, а ключевое слово исчезло:

student_level = 'beginner'

Проверить спорное имя можно стандартным модулем keyword:

import keyword

print(keyword.iskeyword('class'))  # True
print(keyword.iskeyword('student_level'))  # False

Причина 6: «умные» кавычки из мессенджера

Текстовые редакторы и мессенджеры могут заменить прямые кавычки на типографские “ ”. Для Python это другие символы:

print(“hello”)
  File "main.py", line 1
    print(“hello”)
          ^
SyntaxError: invalid character '“' (U+201C)

Замените их на прямые одинарные или двойные кавычки:

print('hello')

Если ошибка появилась после вставки кода, перепечатайте подозрительные кавычки, дефисы и пробелы в редакторе кода. Внешне похожие символы не обязаны иметь одинаковый код Unicode.

Причина 7: код написан для другой версии Python

Новый синтаксис старый интерпретатор разобрать не сможет. Например, match/case появился в Python 3.10. Сначала проверьте, какой Python действительно запускает файл:

python3 --version

На Windows:

py --version

Версия в терминале и выбранный интерпретатор в редакторе должны совпадать. Чтобы существующая .venv стала использовать новую ветку Python, пересоздайте окружение новым интерпретатором и заново установите зависимости.

Как проверить синтаксис без запуска программы

Стандартный модуль py_compile разбирает файл и завершает работу с ненулевым кодом, если нашёл синтаксическую ошибку. Тело программы при этом не выполняется.

На Linux и macOS:

python3 -m py_compile main.py

На Windows:

py -m py_compile main.py

Если команда ничего не напечатала, файл компилируется. Это не доказывает, что программа работает правильно: NameError, TypeError и ошибки в логике появляются уже во время выполнения.

Почему try/except не ловит SyntaxError

Python сначала целиком компилирует файл и только потом начинает выполнять первую строку. Поэтому этот except никогда не запустится:

try:
    if total > 100
        print(total)
except SyntaxError:
    print('ошибка синтаксиса')

Перехватить SyntaxError можно при явном разборе строки через compile(), eval() или exec(), потому что основной файл к этому моменту уже скомпилирован. Для обычного .py-файла синтаксис нужно исправить до запуска.

IndentationError и TabError относятся к тому же семейству, но говорят именно о структуре блоков. Лишние отступы, смешанные табы и несовпадающие уровни разобраны отдельно в статье «IndentationError: unexpected indent».

Источники