Что выводит скрипт при запуске python script.py

Что выводит скрипт при запуске 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

Это то, что будет выполнено при запуске 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 рядом с текущей директорией:

python

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

bash

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

Если запустить с аргументом, например 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].

Report Page