Командная строка: sys.argv, argparse, код выхода

Вспомните: сортировщик «Загрузок» из главы 1 и итоги расходов из урока 2.1 знают, с какой папкой и каким файлом работать, только потому что путь записан прямо в коде. Захотели разобрать другую папку или посчитать другой месяц — открываете .py и правите строку. В этом уроке программа начнёт принимать параметры при запуске, как настоящие утилиты: python sort.py Downloads --dry-run.

🎯 После урока сможете: прочитать, что передали программе при запуске, через sys.argv; описать параметры через argparse — обязательные (позиционные) и необязательные --флаги, с типом, значением по умолчанию и подсказкой; показать справку -h; завершить программу с кодом выхода и проверить его в терминале.

sys.argv: что передали программе при запуске

Всё, что вы пишете в терминале после python, попадает в программу списком строк sys.argv (от англ. argument values — значения аргументов). Модуль sys встроен в Python, его нужно только импортировать. Нулевой элемент — имя самой программы, дальше — слова командной строки по порядку. Слова разделяются пробелами.

import sys

print(sys.argv)
print("Аргументов после имени программы:", len(sys.argv) - 1)

Запуск в терминале из папки с программой и вывод:

> python sort.py Downloads --dry-run
['sort.py', 'Downloads', '--dry-run']
Аргументов после имени программы: 2

Если в имени папки есть пробел, возьмите его в кавычки: python sort.py "Мои загрузки". Терминал снимет кавычки и передаст одно слово Мои загрузки. Без кавычек получится два аргумента: Мои и загрузки.

Сверху строка терминала: python sort.py Downloads --dry-run. Слово python подписано «запускает интерпретатор, в список не попадает». Под остальными тремя словами — три ячейки списка sys.argv с номерами: [0] 'sort.py', [1] 'Downloads', [2] '--dry-run'. От каждого слова стрелка вниз в свою ячейку. Под ячейкой [0] подпись «имя программы», под [1] и [2] — «аргументы, всегда строки».

Все элементы sys.argv — строки, даже если вы ввели цифры. Число из аргумента получают через int() или float(), как с input(). Разбирать аргументы вручную можно и дальше: проверить длину списка и найти флаг оператором in. Если аргументов не хватает, программа сообщает об этом и завершается через sys.exit(1) — что значит число 1, разберём в конце урока.

import sys

if len(sys.argv) < 2:
    print("Укажите папку: python sort.py ПАПКА [--dry-run]")
    sys.exit(1)

folder = sys.argv[1]
dry_run = "--dry-run" in sys.argv
print("Папка:", folder)
print("Пробный прогон:", dry_run)
> python sort.py Downloads --dry-run
Папка: Downloads
Пробный прогон: True
> python sort.py
Укажите папку: python sort.py ПАПКА [--dry-run]

Для одного-двух аргументов этого хватает. Но когда параметров пять, часть из них необязательна, одни — числа, другие — флаги, ручной разбор разрастается в десятки строк проверок. Для этого есть argparse.

Проверьте себя

Задание. Что выведет print(sys.argv[1]), если запустить программу командой из последней строки кода? Введите значение без кавычек.

Исходный код для этого задания:

import sys

print(sys.argv)
print("Аргументов после имени программы:", len(sys.argv) - 1)

# запуск в терминале:
# python sort.py Pictures --dry-run

Подсказка: Вспомните, какой элемент списка занимает имя программы, и отсчитайте от него.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Задание. Что выведет программа при таком запуске? Введите число.

Исходный код для этого задания:

import sys

print(len(sys.argv))

# запуск в терминале:
# python itogi.py rashody.csv --month 2026-09

Подсказка: Выпишите слова команды после python и посчитайте, какие из них попадут в список.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Папка называется «Мои загрузки». Человек запустил сортировщик командой ниже, без кавычек. Что программа напечатает?

Исходный код для этого задания:

import sys

print(sys.argv[1])

# запуск в терминале:
# python sort.py Мои загрузки
АМои загрузки
БМои
Взагрузки
Гsort.py

Подсказка: Чем терминал разделяет аргументы и что меняют кавычки?

Онлайн-проверка ответа появится позже

Задание. Программа должна сложить две суммы из командной строки. Что она выведет на самом деле? Введите вывод целиком.

Исходный код для этого задания:

import sys

print(sys.argv[1] + sys.argv[2])

# запуск в терминале:
# python summa.py 500 250

Подсказка: Какого типа элементы sys.argv? Что делает + с такими значениями?

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

argparse: позиционный аргумент и флаг

Модуль argparse тоже встроен в Python. Работа с ним в три шага:

  1. parser = argparse.ArgumentParser(description="…") — создаём разборщик; description — одна фраза о программе для справки.
  2. parser.add_argument(…) — описываем по одному каждый параметр.
  3. args = parser.parse_args() — разборщик читает sys.argv, проверяет его и возвращает объект args: значение каждого параметра лежит в нём под своим именем, args.folder.

Параметры бывают двух видов. Позиционный — имя без дефисов, например "folder": обязательный, его значение берётся по месту в команде. Необязательный — имя с двумя дефисами, например "--dry-run": его можно не писать. action="store_true" превращает параметр во флаг без значения: написали --dry-run — будет True, не написали — False. Дефис в имени флага в объекте args заменяется на подчёркивание: args.dry_run, потому что имя переменной с дефисом Python не примет. help — подсказка к параметру, она появится в справке.

import argparse

parser = argparse.ArgumentParser(description="Раскладывает файлы папки по подпапкам.")
parser.add_argument("folder", help="папка, которую разбираем")
parser.add_argument("--dry-run", action="store_true", help="только показать, что куда переедет")
args = parser.parse_args()

print("Папка:", args.folder)
print("Пробный прогон:", args.dry_run)
> python sort.py Downloads --dry-run
Папка: Downloads
Пробный прогон: True
> python sort.py Downloads
Папка: Downloads
Пробный прогон: False

Чтобы проверить разбор без терминала, передайте в parse_args список слов сами: parser.parse_args(["Downloads", "--dry-run"]) разберёт их так же, как команду python sort.py Downloads --dry-run. Так удобно пробовать параметры прямо в редакторе, и так устроены задания ниже.

Проверьте себя

Контрольный вопрос. Какую строку добавить в сортировщик, чтобы флаг —verbose (подробный вывод) можно было написать без значения и получить True?

Аparser.add_argument(«—verbose», action=»store_true»)
Бparser.add_argument(«verbose», action=»store_true»)
Вparser.add_argument(«—verbose», type=bool)
Гparser.add_argument(«—verbose», default=True)

Подсказка: Нужно два признака: параметр необязательный (как это видно по имени) и превращается в True только от своего присутствия.

Онлайн-проверка ответа появится позже

Задание. Допишите пропуск: программа должна напечатать значение флага —skip-hidden. Введите имя атрибута, которое стоит на месте ____.

Исходный код для этого задания:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("folder")
parser.add_argument("--skip-hidden", action="store_true")
args = parser.parse_args(["Downloads", "--skip-hidden"])
print(args.____)

Подсказка: Как argparse переделывает дефисы в имени флага, чтобы получилось допустимое имя переменной?

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Задание. Что выведет программа? Введите строку вывода целиком, как её печатает print.

Исходный код для этого задания:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("folder")
parser.add_argument("--dry-run", action="store_true")
args = parser.parse_args(["Фото"])
print(args.folder, args.dry_run)

Подсказка: Какое значение получает флаг store_true, если его нет в списке слов?

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

type, default и справка -h

Итогам расходов нужны параметры посложнее: файл (обязательный), месяц, порог суммы и сколько крупных статей показать. Два новых аргумента add_argument:

  • type=int или type=float — argparse сам превратит строку в число. Без type значение остаётся строкой, как в sys.argv.
  • default=… — значение, если параметр не написали. Без default необязательный параметр получает None.

После --month и --top в команде идёт значение через пробел: --top 5.

import argparse

parser = argparse.ArgumentParser(description="Итоги расходов из CSV-файла.")
parser.add_argument("file", help="CSV-файл: дата;статья;сумма")
parser.add_argument("--month", help="месяц в виде ГГГГ-ММ, например 2026-09")
parser.add_argument("--min", type=float, default=0, help="не считать траты меньше этой суммы")
parser.add_argument("--top", type=int, default=3, help="сколько крупных статей показать")
args = parser.parse_args()

print(args.file, args.month, args.min, args.top)
> python itogi.py rashody.csv --month 2026-09 --top 5
rashody.csv 2026-09 0 5
> python itogi.py rashody.csv
rashody.csv None 0 3

Во втором запуске --month не указан, и там None; --min и --top взяли значения из default.

Справку argparse собирает сам из description и help. Её показывает флаг -h (или --help), писать его в add_argument не нужно:

> python itogi.py -h
usage: itogi.py [-h] [--month MONTH] [--min MIN] [--top TOP] file

Итоги расходов из CSV-файла.

positional arguments:
  file           CSV-файл: дата;статья;сумма

options:
  -h, --help     show this help message and exit
  --month MONTH  месяц в виде ГГГГ-ММ, например 2026-09
  --min MIN      не считать траты меньше этой суммы
  --top TOP      сколько крупных статей показать

Строка usage — краткая форма команды: в квадратных скобках — необязательное, MONTH и TOP показывают, что после флага ждут значение. Служебные слова справки — по-английски, ваши подсказки — как вы их написали. В Python до 3.10 раздел options называется optional arguments, а в 3.14 справка в терминале цветная.

Окно терминала с командой python itogi.py -h и справкой. Строка usage: itogi.py [-h] [--month MONTH] [--min MIN] [--top TOP] file. Ниже описание «Итоги расходов из CSV-файла.», раздел positional arguments с file и подсказкой «CSV-файл: дата;статья;сумма», раздел options с -h, --month MONTH, --min MIN, --top TOP и их подсказками. Выноски сбоку связывают строки справки с кодом: description=… → строка описания, help=… → текст справа от параметра, квадратные скобки → «необязательный».

Проверьте себя

Задание. Что выведет программа? Введите число.

Исходный код для этого задания:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("file")
parser.add_argument("--top", type=int, default=3)
args = parser.parse_args(["rashody.csv"])
print(args.top * 10)

Подсказка: Есть ли —top в списке слов? Если нет, откуда argparse возьмёт значение?

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Задание. Что выведет программа? Введите число, как его напечатает print.

Исходный код для этого задания:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("file")
parser.add_argument("--min", type=float, default=0)
args = parser.parse_args(["rashody.csv", "--min", "150"])
print(args.min * 2)

Подсказка: Во что превратит строку «150» параметр type=float? Как print показывает такие числа?

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Задание. Автор забыл одну вещь в описании —top. Что выведет программа? Введите вывод целиком.

Исходный код для этого задания:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("file")
parser.add_argument("--top", default=3)
args = parser.parse_args(["rashody.csv", "--top", "4"])
print(args.top * 2)

Подсказка: Есть ли у —top параметр type? Каким типом тогда остаётся значение из списка слов и что с ним делает * 2?

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Контрольный вопрос. В справке программы строка usage выглядит так. Какие из частей команды ОБЯЗАТЕЛЬНЫ при запуске?

Исходный код для этого задания:

usage: poisk.py [-h] [--level LEVEL] [--limit LIMIT] file word
Атолько file
Бfile и word
В—level и —limit
Гвсе части строки usage

Подсказка: Что в строке usage означают квадратные скобки?

Онлайн-проверка ответа появится позже

Ошибки запуска и код выхода

argparse сам проверяет команду. Забыли обязательный параметр, дали слово вместо числа, опечатались в имени флага — программа не дойдёт до вашего кода: argparse напечатает строку usage, строку error с причиной и остановит работу.

> python itogi.py rashody.csv --top пять
usage: itogi.py [-h] [--month MONTH] [--min MIN] [--top TOP] file
itogi.py: error: argument --top: invalid int value: 'пять'
> python itogi.py rashody.csv --mesyac 2026-09
usage: itogi.py [-h] [--month MONTH] [--min MIN] [--top TOP] file
itogi.py: error: unrecognized arguments: --mesyac 2026-09

Когда программа завершается, она оставляет операционной системе число — код выхода. 0 значит «всё хорошо», любое другое — «что-то не так». Обычная программа, дошедшая до конца, возвращает 0. sys.exit(1) завершает программу сразу с кодом 1 — так делают, когда работать дальше нельзя, например файла нет. argparse при ошибке в команде завершает программу с кодом 2, а после справки -h — с кодом 0.

Код выхода читают другие программы: планировщик задач, bat-файл, скрипт, который запускает вашу утилиту по расписанию. Посмотреть его можно и самим, сразу после запуска:

  • PowerShell (терминал Windows и VS Code на Windows): $LASTEXITCODE
  • командная строка Windows (cmd): echo %errorlevel%
  • macOS и Linux: echo $?
> python itogi.py rashody.csv --top пять
usage: itogi.py [-h] [--month MONTH] [--min MIN] [--top TOP] file
itogi.py: error: argument --top: invalid int value: 'пять'
> $LASTEXITCODE
2
Схема из трёх дорожек, по которым заканчивается запуск python itogi.py. Первая: команда верная, программа дошла до конца — код 0, зелёный кружок. Вторая: файла нет, ваш код вызвал sys.exit(1) — код 1, оранжевый кружок. Третья: ошибка в команде, например --top пять, argparse остановил программу до вашего кода — код 2, красный кружок. Внизу строка: $LASTEXITCODE (PowerShell) / echo $? (macOS, Linux) показывает этот код.

Проверьте себя

Задание. Файла rashody_2025.csv в папке нет. С каким кодом выхода завершится программа? Введите число.

Исходный код для этого задания:

import sys
from pathlib import Path

path = Path("rashody_2025.csv")
if not path.exists():
    print("Нет такого файла:", path)
    sys.exit(1)
print("Файл найден")

Подсказка: Какая ветка выполнится при отсутствующем файле и что делает функция из этой ветки?

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Задание. Человек запустил итоги расходов так: python itogi.py rashody.csv —min сто. Какой код выхода покажет $LASTEXITCODE сразу после этого? Введите число.

Исходный код для этого задания:

import argparse

parser = argparse.ArgumentParser(description="Итоги расходов из CSV-файла.")
parser.add_argument("file", help="CSV-файл: дата;статья;сумма")
parser.add_argument("--month", help="месяц в виде ГГГГ-ММ, например 2026-09")
parser.add_argument("--min", type=float, default=0, help="не считать траты меньше этой суммы")
parser.add_argument("--top", type=int, default=3, help="сколько крупных статей показать")
args = parser.parse_args()

print(args.file, args.month, args.min, args.top)

Подсказка: Дойдёт ли программа до своего print? Кто её остановит и с каким кодом он это делает — сверьтесь с разделом про код выхода.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Задание. В PowerShell выполнили две команды подряд (ниже). Какое число напечатает вторая? Введите число.

> python itogi.py -h

(на экране — справка программы)

> $LASTEXITCODE

Подсказка: Что показывает $LASTEXITCODE? Вспомните, с каким кодом argparse завершает программу после справки, — это сказано в разделе про код выхода.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Собираем: итоги расходов с параметрами

Соединим всё в рабочую утилиту. Файл rashody.csv лежит рядом с программой, разделитель — точка с запятой, без строки заголовков:

2026-08-28;Еда;1200
2026-09-02;Еда;850
2026-09-03;Такси;420
2026-09-05;Связь;600
2026-09-11;Еда;1340
2026-09-14;Кино;700
2026-10-01;Еда;950

Программа: разбор параметров, проверка файла с кодом выхода 1, подсчёт по статьям. date.startswith(args.month) отбирает строки нужного месяца; если --month не указан, там None, и условие args.month and … пропускает фильтр — считаются все строки.

import argparse
import csv
import sys
from pathlib import Path

parser = argparse.ArgumentParser(description="Итоги расходов из CSV-файла.")
parser.add_argument("file", help="CSV-файл: дата;статья;сумма")
parser.add_argument("--month", help="месяц в виде ГГГГ-ММ, например 2026-09")
parser.add_argument("--top", type=int, default=3, help="сколько крупных статей показать")
args = parser.parse_args()

path = Path(args.file)
if not path.exists():
    print("Нет такого файла:", path)
    sys.exit(1)

totals = {}
with open(path, encoding="utf-8", newline="") as f:
    for date, category, amount in csv.reader(f, delimiter=";"):
        if args.month and not date.startswith(args.month):
            continue
        totals[category] = totals.get(category, 0) + int(amount)

print("Всего:", sum(totals.values()))
for category in sorted(totals, key=totals.get, reverse=True)[:args.top]:
    print(category, totals[category])
> python itogi.py rashody.csv --month 2026-09
Всего: 3910
Еда 2190
Кино 700
Связь 600
> python itogi.py rashody.csv --top 2
Всего: 6060
Еда 4340
Кино 700
> python itogi.py rashodi.csv --month 2026-09
Нет такого файла: rashodi.csv

Сохраните itogi.py и rashody.csv в одну папку, откройте в ней терминал и запустите три команды выше. Затем добавьте к своему сортировщику «Загрузок» из главы 1 позиционный параметр с папкой и флаг --dry-run: при нём программа только печатает, что куда переехало бы.

Ещё один приём пригодится для журнала сортировщика. У split есть второй аргумент — сколько раз резать строку, не больше. split(" ", 1) режет по пробелу один раз: получается не больше двух кусков, и всё, что справа от первого пробела, идёт вторым куском целиком, вместе со своими пробелами. Так от строки журнала вида «дата время УРОВЕНЬ сообщение» можно отрезать нужное число полей, не разрезав сообщение на слова:

line = "2026-09-10 11:23 INFO Сортировка завершена"
print(line.split(" "))
print(line.split(" ", 1))
['2026-09-10', '11:23', 'INFO', 'Сортировка', 'завершена']
['2026-09-10', '11:23 INFO Сортировка завершена']

Проверьте себя

Задание. Напишите программу skidka.py целиком. Позиционный параметр price — цена (дробное число). Необязательный —percent — скидка в процентах, целое, по умолчанию 10. Флаг —round — округлить результат функцией round(). Программа печатает цену со скидкой: price * (100 — percent) / 100. Запустите её командой python skidka.py 2490 —percent 12 —round и введите число, которое она напечатала.

Команда запуска:

python skidka.py 2490 —percent 12 —round

Подсказка: Три add_argument: какой параметр позиционный, у какого type и default, какой — флаг store_true. Проверьте программу и без —round, и без —percent.

✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.

Онлайн-проверка ответа появится позже

Задание. Проектная миссия «Итоги месяца одной командой». Доведите итоги расходов до утилиты с параметрами: позиционный file — CSV-файл, —month — месяц ГГГГ-ММ (без него считаются все строки), —min — дробное число, траты меньше него не считаются, по умолчанию 0. Файла нет — программа сообщает об этом и завершается с кодом 1. Данные ниже — файл rashody.csv (utf-8, 52 строки «дата;статья;сумма», без заголовка). Запустите: python itogi.py rashody.csv —month 2026-09 —min 300. В поле ответа — сумма расходов, которую напечатала программа. Приложите файл программы .py; в поле ответа — число.

Принято, если:
1. введённое число совпадает с эталоном;
2. приложен файл .py, который это число выдаёт на данных из условия этой командой;

Самопроверка перед сдачей (преподаватель смотрит на занятии):
3. python itogi.py -h показывает справку с подсказкой к каждому параметру;
4. запуск с несуществующим файлом даёт код выхода 1 (проверьте $LASTEXITCODE или echo $?).

2026-08-02;Связь;706

2026-08-06;Связь;122

2026-08-08;Подарки;1220

2026-08-09;Кино;974

2026-08-09;Такси;370

2026-08-10;Связь;227

2026-08-12;Аптека;172

2026-08-12;Кино;623

2026-08-15;Одежда;1565

2026-08-16;Такси;283

2026-08-17;Связь;1746

2026-08-20;Аптека;1095

2026-08-22;Связь;910

2026-08-25;Такси;690

2026-08-27;Такси;465

2026-08-28;Подарки;654

2026-09-03;Одежда;2140

2026-09-05;Одежда;4459

2026-09-06;Такси;760

2026-09-07;Еда;873

2026-09-07;Одежда;123

2026-09-08;Такси;3985

2026-09-11;Кино;1400

2026-09-12;Такси;1543

2026-09-13;Такси;200

2026-09-15;Подарки;489

2026-09-15;Подарки;1029

2026-09-16;Еда;216

2026-09-16;Кино;946

2026-09-16;Кино;1255

2026-09-17;Кино;814

2026-09-17;Подарки;804

2026-09-18;Такси;457

2026-09-20;Одежда;159

2026-09-24;Аптека;155

2026-09-24;Еда;1288

2026-09-25;Аптека;644

2026-09-29;Еда;4206

2026-09-30;Связь;94

2026-10-02;Подарки;1201

2026-10-02;Связь;264

2026-10-07;Еда;979

2026-10-10;Аптека;201

2026-10-10;Одежда;940

2026-10-14;Одежда;4061

2026-10-17;Связь;339

2026-10-19;Еда;621

2026-10-23;Подарки;270

2026-10-24;Одежда;1259

2026-10-24;Одежда;1440

2026-10-24;Такси;1146

2026-10-25;Подарки;2621

Подсказка: Сначала отберите строки месяца, потом отсейте мелкие траты; сверьте результат без —min с ручным подсчётом нескольких строк.

✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.

Онлайн-проверка ответа появится позже

Задание. Проектная миссия «Поиск в журнале с параметрами». Сортировщик пишет журнал zhurnal.txt (utf-8, данные ниже, 50 строк вида «дата время УРОВЕНЬ сообщение»). Напишите утилиту poisk.py: позиционный file; —level — уровень записи, по умолчанию ERROR; —since — дата ГГГГ-ММ-ДД, записи раньше неё не считаются, без неё — все даты. Программа печатает число подходящих записей, а если их ноль — завершается с кодом 1. Запустите: python poisk.py zhurnal.txt —level WARNING —since 2026-09-20. В поле ответа — напечатанное число. Приложите файл программы .py; в поле ответа — число.

Принято, если:
1. введённое число совпадает с эталоном;
2. приложен файл .py, который это число выдаёт на данных из условия этой командой;

Самопроверка перед сдачей (преподаватель смотрит на занятии):
3. python poisk.py zhurnal.txt без флагов ищет ERROR за все даты;
4. поиск несуществующего уровня (—level CRITICAL) завершается с кодом 1.

2026-09-01 10:56 INFO Запуск по расписанию

2026-09-01 19:26 WARNING Медленный диск

2026-09-01 21:26 INFO Отчёт сохранён

2026-09-02 05:30 ERROR Не найден файл otchet.xlsx

2026-09-02 10:14 INFO Запуск по расписанию

2026-09-04 01:11 INFO Отчёт сохранён

2026-09-04 11:42 ERROR Ошибка кодировки в zametki.txt

2026-09-05 04:50 INFO Запуск по расписанию

2026-09-06 07:30 WARNING Пустая строка в rashody.csv

2026-09-07 13:57 WARNING Файл уже существует, пропуск

2026-09-10 11:23 INFO Сортировка завершена

2026-09-10 20:56 ERROR Нет доступа к папке

2026-09-11 02:46 WARNING Медленный диск

2026-09-11 10:06 INFO Сортировка завершена

2026-09-11 10:24 WARNING Файл уже существует, пропуск

2026-09-12 00:09 WARNING Медленный диск

2026-09-13 03:10 INFO Запуск по расписанию

2026-09-14 07:44 WARNING Пустая строка в rashody.csv

2026-09-15 22:52 WARNING Медленный диск

2026-09-16 01:53 INFO Запуск по расписанию

2026-09-16 05:20 INFO Сортировка завершена

2026-09-17 04:38 WARNING Пустая строка в rashody.csv

2026-09-17 11:38 INFO Сортировка завершена

2026-09-17 17:42 ERROR Нет доступа к папке

2026-09-18 04:02 ERROR Не найден файл otchet.xlsx

2026-09-18 04:59 ERROR Не найден файл otchet.xlsx

2026-09-18 17:33 INFO Сортировка завершена

2026-09-19 08:52 ERROR Не найден файл otchet.xlsx

2026-09-19 21:07 ERROR Ошибка кодировки в zametki.txt

2026-09-20 02:25 INFO Отчёт сохранён

2026-09-20 04:54 WARNING Пустая строка в rashody.csv

2026-09-20 23:59 INFO Найдено файлов: 12

2026-09-22 16:46 INFO Запуск по расписанию

2026-09-23 16:55 INFO Запуск по расписанию

2026-09-24 11:34 WARNING Файл уже существует, пропуск

2026-09-24 15:10 WARNING Медленный диск

2026-09-24 16:33 INFO Найдено файлов: 12

2026-09-25 03:42 WARNING Медленный диск

2026-09-25 07:57 WARNING Пустая строка в rashody.csv

2026-09-26 00:36 WARNING Медленный диск

2026-09-27 22:54 INFO Сортировка завершена

2026-09-27 23:55 WARNING Файл уже существует, пропуск

2026-09-28 08:09 WARNING Файл уже существует, пропуск

2026-09-28 10:37 INFO Запуск по расписанию

2026-09-28 22:45 INFO Запуск по расписанию

2026-09-29 08:11 WARNING Медленный диск

2026-09-29 18:14 WARNING Файл уже существует, пропуск

2026-09-29 19:46 WARNING Пустая строка в rashody.csv

2026-09-30 04:25 WARNING Медленный диск

2026-09-30 06:51 ERROR Ошибка кодировки в zametki.txt

Подсказка: Сообщение само содержит пробелы: режьте строку через split(» «, N) с таким числом N, чтобы дата, время и уровень отделились, а сообщение осталось одним куском. Даты в виде ГГГГ-ММ-ДД можно сравнивать как строки или через datetime из урока 2.2.

✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.

Онлайн-проверка ответа появится позже

Что дальше

Теперь вы умеете читать параметры запуска из sys.argv, описывать их через argparse — позиционные, --флаги с store_true, type, default и help, — показывать справку -h и завершать программу с кодом выхода. Ваши утилиты больше не надо править перед каждым запуском. Но командная строка удобна не всем: коллега, который не открывает терминал, ждёт окно с кнопками. В следующем уроке делаем первое окно на Tkinter.

← Назад · ↑ В начало урока · ⌂ К навигатору курса · Вперёд →

Школа Виктора Комлева