SyntaxError: invalid syntax появляется до запуска программы: Python не смог разобрать исходный текст по правилам языка. Поэтому try/except внутри того же файла не поможет — интерпретатор ещё не дошёл до выполнения кода.
Начните с последней строки сообщения, затем посмотрите на имя файла, номер строки и стрелку. Если явной ошибки под стрелкой нет, проверьте символ прямо перед ней и предыдущую строку. Все сообщения ниже воспроизведены на CPython 3.14.5.
Стрелка показывает обнаружение, не всегда причину
SyntaxError показывает, где Python больше не смог продолжать разбор. Исправлять часто нужно символ перед ней или предыдущую строку.Как читать сообщение 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».
Не нашёл свою ошибку в разборе? Вставь трейсбек в расшифровщик ошибок Python: он переведёт сообщение, назовёт причину и покажет починку.