Как Python формирует sys.argv и почему вывод будет "3 True"

Как Python формирует sys.argv и почему вывод будет "3 True"

@python_quiz

Разберем этот квиз

Код из квиза:

python

Кратко: при запуске, приведённом в комментарии, вывод программы будет

bash

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

Почему len(sys.argv) == 3

  • sys.argv — список аргументов командной строки.
  • По соглашению, первый элемент sys.argv[0] — имя исполняемого скрипта.
  • В нашем запуске аргументы командной строки: script.py, one, two three.

- Последний аргумент заключён в кавычки, поэтому оболочка передаёт его как один элемент (с пробелом внутри).

  • Следовательно, sys.argv = ['script.py', 'one', 'two three'] → len == 3.

Чтобы убедиться, можно вывести сам список:

python

Пример запуска:

bash

Почему sys.argv[0] == __file__ даёт True

  • __file__ — имя файла модуля (обычно путь, указанный при запуске).
  • При стандартного запуска python script.py обычно оба значения дают одинаковую строку (например, 'script.py' или './script.py'), поэтому сравнение равенства готово вернуть True.
  • Заметьте: это сравнение строчное — если один путь содержит префикс (./script.py) или абсолютный путь, а другой — относительный, равенство будет False, хотя это тот же файл.

Для диагностики полезно смотреть repr() или полные строки:

python

Разбор всех вариантов ответов и когда они возможны

В квизе перечислены четыре возможных вывода: "3 True", "3 False", "4 True", "4 False". Вот когда каждый из них может появиться.

  • "3 True"

- Происходит при запуске python script.py one "two three" в типичной оболочке.
- Кавычки объединяют two three в один аргумент → len == 3.
- sys.argv[0] и __file__ совпадают по строковому представлению → True.

  • "3 False"

- Тоже будет len == 3 (кавычки сохраняют two three в одном элементе).
- Но sys.argv[0] отличается от __file__ по строке, например:
- Запуск через полный путь: python ./script.py one "two three", __file__ может быть 'script.py', а sys.argv[0] — './script.py' (или наоборот).
- Запуск из среды, где sys.argv[0] изменён (shortcut/обёртка), или изменения пути в окружении.
- В таких случаях результат сравнения — False.

  • "4 True"

- len == 4 получится, если кавычки убрать и передать two и three как отдельные аргументы:
- python script.py one two three → sys.argv = ['script.py', 'one', 'two', 'three'] → len == 4.
- При этом sys.argv[0] и __file__ могут совпадать (обычный запуск), поэтому сравнение вернёт True.

  • "4 False"

- len == 4 как в предыдущем случае (нет объединяющих кавычек).
- sys.argv[0] и __file__ отличаются по строке — например, из-за различий в путях или особенностей запуска — тогда сравнение даст False.

Практические советы

  • Если вам важно сравнивать путь до исполняемого файла, используйте нормализацию путей:
python
  • Для отладки выводите repr() значений, чтобы увидеть точные строки и возможные префиксы (./, абсолютный путь и т.д.).
  • Помните, что поведение может отличаться при запуске через python -m, через zip/установленные пакеты, в IDE или при упаковке приложения (например, pyinstaller).

Вывод

При запуске python script.py one "two three" аргументы будут ['script.py', 'one', 'two three'], поэтому длина списка — 3. При типичном запуске sys.argv[0] и __file__ равны по строковому представлению, поэтому сравнение даёт True. Возможны и другие комбинации результатов при изменении кавычек в командной строке или различий в представлении путей.

Report Page