Что выводит скрипт при запуске python script.py
@python_quizРазберем этот квиз
Коротко: при запуске скрипта файла вида script.py командой python script.py переменная sys.argv содержит только имя скрипта, а внутри самого скрипта доступна переменная __file__ с именем (путём) этого файла. В типичном случае сравнение sys.argv[0] == __file__ даёт True, а len(sys.argv) == 1, поэтому вывод будет:
1 True
Далее — разбор кода, вариантов и тонкие моменты поведения.
Условие (код скрипта)
Предположим, что файл script.py присутствует в рабочей директории и содержит такой код:

Это то, что будет выполнено при запуске python script.py.
Что делает код
- sys.argv — список аргументов командной строки, где элемент 0 — строка, которую интерпретатор считает именем вызываемого скрипта.
- len(sys.argv) — количество элементов в этом списке.
__file__— в модуле (выполняемом как скрипт или импортированном) содержит путь к файлу модуля (тот путь, по которому модуль был загружен).- Выражение
sys.argv[0] == __file__сравнивает строку, которую интерпретатор поместил в argv[0], с тем, что внутри модуля лежит в__file__.
При простом запуске без дополнительных аргументов sys.argv содержит только имя скрипта, поэтому len == 1, и обычно sys.argv[0] равен __file__ (с той же строкой пути), следовательно печатается "1 True".
Анализ вариантов (по содержанию)
- Вариант с выводом "1 True" — соответствует поведению при запуске
python script.pyв обычной ситуации (скрипт в текущей директории). - Вариант с выводом "1 False" — не соответствует ожиданию в типичных условиях; возможен лишь при нестандартном различии строк (см. замечания ниже).
- Вариант с выводом "2 True" — неверен для запуска без дополнительных аргументов: len(sys.argv) будет не 2, а 1.
- Вариант с выводом "2 False" — также неверен для запуска без аргументов.
Демонстрация: как проверить локально
1) Создайте файл script.py рядом с текущей директорией:

2) Запустите в терминале:

Ожидаемый вывод (в типичном окружении):

Если запустить с аргументом, например python script.py arg1, вывод станет:

потому что теперь sys.argv = ['script.py', 'arg1'].
Тонкие моменты и исключения
- Представление пути: sys.argv[0] и
__file__— строки, и их точное совпадение зависит от того, как был передан путь. Примеры:
- python script.py в текущей директории обычно даёт обе строки 'script.py'.
- python ./script.py может поместить в argv[0] './script.py', а __file__ — 'script.py' или './script.py' в зависимости от версии/реализации; в редких случаях строки могут не совпасть, и тогда сравнение даст False.
- Если интерпретатор нормализует путь иначе (абсолютный vs относительный), тоже возможно несоответствие.
- Запуск с -c: при использовании
python -c "..."переменная__file__в таком коде обычно не определяется, и попытка обратиться к ней вызоветNameError. При этом sys.argv[0] будет равен '-c'. - Интерактивный режим (REPL): при запуске интерактивного интерпретатора sys.argv[0] обычно равен пустой строке ''.
- Запуск модуля через
python -m moduleили запуск zipapp может изменить содержимое sys.argv[0] (например, это может быть путь к модулю/архиву). - Итого: правило об «обычном» поведении справедливо для классического запуска файла как скрипта без хитростей.
Вывод
При запуске файла script.py командой python script.py (скрипт находится в текущей директории и запускается обычным способом) ожидаемый вывод программы из условия — строка, показывающая, что в sys.argv только имя скрипта (len == 1) и что argv[0] совпадает с __file__ (True). Однако при иных способах запуска или разных способах указания пути возможны отклонения — это важно учитывать при переносе скриптов или при написании кода, зависящего от точного содержимого sys.argv[0].