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».