Вы прочитали 1 из 3 бесплатных методичек сегодня
Экстракт 24 июля 2019

Автоматизация внешних команд в Python: управление процессами и потоками данных

Corey Schafer · Corey Schafer Верифицирован 19:01

Освоение модуля subprocess для запуска системных утилит, перехвата их вывода и организации взаимодействия между процессами. Практическое руководство для разработчиков, стремящихся автоматизировать системные задачи за 19 минут.

⚡ Зачем читать

  • Вы научитесь расширять возможности Python, используя мощь системных утилит Linux/Windows прямо из кода.
  • Вы освоите безопасную передачу аргументов, исключая риски инъекций, присущие использованию shell.
  • Вы поймете, как эффективно перехватывать потоки данных (stdout/stderr) для логирования и анализа.
11 тезисов 4 задания 3 цитаты ⏱ 16 мин чтения 🎯 11 тезисов
YouTube Транскрипт Сохранить
Поделиться: TG WA VK X

Для AI-агентов и LLM

Экстракт доступен в структурированном Markdown. Скачать .md · JSON API · Site index

💡 Ключевые тезисы (11)

1 Импортируйте модуль subprocess для взаимодействия с ОС #
Подключите библиотеку subprocess для выполнения внешних команд напрямую из Python-скрипта. Это базовый шаг для расширения функционала вашего кода за счет системных инструментов.
2 Используйте метод run для запуска простых команд #
Применяйте subprocess.run(command) для исполнения команд вроде ls или dir. Это самый прямой способ вызвать утилиту командной строки из вашей программы.
3 Передавайте аргументы в виде списка для безопасности #
Формируйте команды как список строк, например ['ls', '-la'], вместо передачи одной общей строки. Это исключает риск внедрения команд и повышает надежность.
4 Управляйте поведением shell #
Устанавливайте shell=True только в случаях, когда команда требует доступа к встроенным функциям оболочки. Помните о рисках безопасности при работе с ненадежным вводом.
5 Захватывайте вывод процессов в переменные #
Используйте capture_output=True для сохранения результата выполнения команды в объект CompletedProcess. Это позволяет программно обрабатывать полученные данные вместо их вывода в консоль.
6 Анализируйте коды завершения для проверки успеха #
Проверяйте p1.returncode: значение 0 гарантирует успешное выполнение, любое иное число указывает на возникновение ошибки при работе внешней программы.
7 Преобразуйте байтовый вывод в читаемые строки #
Используйте параметр text=True или метод .decode(), чтобы превратить стандартный вывод в удобную для обработки строковую переменную.
8 Перенаправляйте вывод команд в файлы #
Используйте контекстный менеджер open() для направления результата работы утилиты в текстовый файл вместо консоли для целей логирования.
9 Вызывайте исключения при сбоях команд #
Добавьте аргумент check=True, если хотите, чтобы Python автоматически выбрасывал ошибку при неудачном завершении внешней команды.
10 Игнорируйте ошибки через dev/null #
Перенаправляйте stderr в subprocess.DEVNULL, если вы намеренно хотите скрыть сообщения об ошибках от пользователя или системы.
11 Организуйте конвейеры ввода-вывода #
Передавайте результат выполнения одного процесса в качестве входных данных (input) для другого. Это позволяет строить цепочки обработки данных, аналогичные Unix-пайпам.

Автоматизация внешних команд в Python: управление процессами

🗺 Карта навыков

Навык Инструмент Уровень
Запуск команд subprocess.run() Базовый
Обработка вывода capture_output=True Средний
Управление ошибками returncode / check=True Средний
Конвейеры данных input= / subprocess.PIPE Продвинутый

1. Основы запуска: subprocess.run против shell

Взаимодействие с операционной системой — это фундаментальный навык для системного администратора и DevOps-инженера, пишущего на Python. Модуль subprocess является стандартом де-факто для замены старых функций типа os.system. В этом блоке мы разберем, как вызвать простую команду, например ls (на macOS/Linux) или dir (на Windows), и почему способ передачи аргументов критически важен для безопасности вашего приложения.

Спикер Corey Schafer наглядно показывает, что простейший запуск команды выглядит как вызов функции subprocess.run(['ls', '-la']). Обратите внимание: аргументы передаются списком. Это не прихоть разработчиков, а защита от shell-инъекций. Если вы передаете команду как одну строку, Python вынужден вызывать оболочку (shell=True), что открывает «двери» для злоумышленников, если в строке окажется пользовательский ввод. Например, если пользователь введет ls; rm -rf /, то при включенном shell=True ваш скрипт выполнит обе команды. Используя список, вы гарантируете, что аргументы будут переданы программе напрямую, как массив argv в C-языках.

Разница между платформами проявляется при вызове команд, встроенных в оболочку (built-ins). Команда dir в Windows не существует как отдельный исполняемый файл, поэтому для её работы требуется shell=True. В этом случае Python запускает cmd.exe, который уже интерпретирует команду dir. При этом важно помнить: «if you're using the shell equals true then that can be a security hazard if you're using untrusted input so only use that if you're passing in the arguments yourself».

В своей практике я часто сталкиваюсь с тем, что новички пытаются использовать shell=True везде ради удобства, забывая о рисках. Если ваша задача — просто запустить сторонний исполняемый файл, всегда предпочитайте список аргументов. Это делает код кроссплатформенным и предсказуемым. Если вы работаете на Mac или Linux, используйте ls или grep, если на Windows — соответствующие аналоги, но старайтесь минимизировать использование shell=True до крайних случаев, когда это действительно необходимо для работы команд оболочки.

✅ Сделайте сейчас: Создайте файл test.py. Напишите скрипт, который вызывает ls -la (или dir для Windows, обернув в shell=True) и выводит результат в консоль. Убедитесь, что вы используете список аргументов ['ls', '-la'] для повышения безопасности.

2. Захват потоков данных: управление выводом и кодами завершения

Запуск команды — это лишь половина дела. Настоящая магия автоматизации начинается, когда мы начинаем «слушать» то, что говорит нам система. По умолчанию subprocess.run перенаправляет вывод (stdout) в консоль, где запущен Python. Это удобно для отладки, но бесполезно для автоматизации. Чтобы программно обработать ответ внешней утилиты, нам нужно «захватить» этот поток в переменную.

Использование аргумента capture_output=True — это самый современный и чистый способ сделать это. Внутри subprocess этот параметр перенаправляет стандартный вывод и ошибки в специальные пайпы. После завершения выполнения команды Python возвращает объект CompletedProcess. Этот объект — ваш лучший друг: он содержит args (оригинальную команду), returncode и stdout.

Важный нюанс: по умолчанию вывод захватывается в виде байтов (bytes). Если вы попытаетесь вывести p1.stdout напрямую, вы увидите нечто вроде b'file1.txt\nfile2.py'. Чтобы работать с этим как с текстом, у вас есть два пути: вызвать .decode() на результат или передать text=True в функцию run(). Спикер отмечает: «In this case when we decode those bytes it's converting it into a string». Это фундаментальное различие: работа с байтами необходима, если команда возвращает бинарные данные (изображения, архивы), но для текстовых логов text=True — идеальный выбор.

Также уделите внимание returncode. В программировании на C или Bash принято, что 0 означает успех, а любое другое число — ошибку. Спикер напоминает: «zero errors» — отличная мнемоника для запоминания, почему 0 считается успехом. Если вы хотите сделать свой скрипт «строгим», используйте check=True. В этом случае при получении ненулевого кода завершения Python автоматически выбросит исключение CalledProcessError. Это избавляет от необходимости писать каскады if для проверки каждого результата команды. Это лучший способ управления потоком при выполнении цепочки команд, где каждая последующая зависит от успеха предыдущей.

✅ Сделайте сейчас: Модифицируйте предыдущий код. Добавьте capture_output=True и text=True. Сохраните вывод команды в переменную result и выведите на экран длину полученной строки (функция len()), а также проверьте result.returncode. Попробуйте вызвать несуществующую команду и убедитесь, что returncode стал равен 1.


3. Управление ошибками и перенаправление потоков: стратегия «тихого» выполнения

В процессе автоматизации системных задач мы неизбежно сталкиваемся с ситуациями, когда внешняя команда завершается с ошибкой. В мире Python поведение модуля subprocess по умолчанию может показаться «слишком мягким»: если вы запустите команду, которая не существует или не может быть выполнена, скрипт просто продолжит работу, вернув ненулевой код завершения. Как методист с многолетним стажем, я подчеркиваю: игнорирование returncode — прямой путь к непредсказуемому поведению системы. Corey Schafer на примере команды ls в несуществующей директории (например, ls dne) показывает, что программа не выбрасывает исключение автоматически. Код возврата 1 сигнализирует о проблеме, но Python «молча» переходит к следующей строке кода. Чтобы сделать процесс надежным, необходимо либо анализировать returncode, либо использовать механизм check=True.

Когда мы добавляем аргумент check=True, поведение меняется радикально: при получении любого кода, отличного от нуля, Python генерирует исключение CalledProcessError. Это позволяет перехватывать ошибки через try/except, что является «золотым стандартом» обработки исключений в Python. Спикер отмечает: «If you did want Python to throw an exception if the external command fails then we can just pass in an argument of check equals to true». Это дает вам полный контроль: вы можете логировать ошибку, отправить уведомление администратору или прервать выполнение критически важного процесса.

Существует и обратная ситуация: иногда нам нужно подавить вывод ошибок, чтобы они не засоряли консоль или не пугали пользователя. Здесь на помощь приходит subprocess.DEVNULL. Это специальный объект, который работает как «черная дыра» (аналог /dev/null в Unix). Перенаправляя stderr=subprocess.DEVNULL, вы гарантируете, что даже если внешняя утилита попытается «пожаловаться» на отсутствие файла, эта информация не попадет в ваш лог. Corey Schafer показывает, как это лаконично выглядит: stderr=subprocess.DEVNULL. Это профессиональный подход к созданию чистого интерфейса командной строки для ваших собственных инструментов. Понимание того, когда следует падать с ошибкой, а когда — тихо игнорировать помехи, отличает скрипт-однодневку от надежного инструментария DevOps-инженера.

✅ Сделайте сейчас: Напишите скрипт, который пытается удалить несуществующий файл командой rm (Linux) или del (Windows) через subprocess.run. Установите check=True и оберните вызов в блок try-except, чтобы перехватить исключение subprocess.CalledProcessError и вывести сообщение «Команда не удалась, проверьте параметры». Затем измените код, убрав check=True и добавив stderr=subprocess.DEVNULL, чтобы увидеть, как скрипт становится «тихим».

4. Конвейеризация процессов: передача данных между командами

Вершиной мастерства в автоматизации является создание цепочек команд (pipelines), где вывод одной утилиты становится входными данными для другой. В терминале Linux мы привыкли использовать символ | (пайп), например cat file.txt | grep 'pattern'. В Python модуль subprocess позволяет реализовать ту же логику программно, обеспечивая гибкую обработку данных на лету без необходимости создавать промежуточные временные файлы. Corey Schafer демонстрирует это на примере связки cat и grep. Мы запускаем первый процесс, захватываем его вывод, а затем передаем его в параметр input второго процесса.

Спикер объясняет: «It's definitely useful to know how to pass in the input to different external commands because you know if you are doing step-by-step processing and doing some string parsing or something like that using Python then you can pass in those results into a different command». Это открывает возможности для создания сложных конвейеров обработки данных. Например, вы можете прочитать вывод команды ps aux, передать его в Python для фильтрации, а затем отправить отфильтрованный список в команду mail или curl для отправки отчета. Передача данных через input аргумент в subprocess.run делает ваш скрипт связующим звеном между разрозненными системными утилитами. Это гораздо безопаснее и эффективнее, чем чтение и запись данных на диск.

При работе с пайпами важно помнить про формат данных. Когда вы захватываете поток через capture_output=True, данные приходят в виде байтов. Если вы планируете передавать их дальше в качестве input, убедитесь, что вы правильно управляете кодировкой. Использование text=True упрощает жизнь, так как Python берет на себя конвертацию между строками и байтами, позволяя вам работать с человекочитаемым текстом. Corey Schafer показывает, как он берет вывод cat test.txt в переменной p1.stdout и передает его как input в процесс p2 (grep). Это наглядно доказывает мощь Python как «клея» для системных инструментов. Подобный подход позволяет не изобретать велосипеды, а использовать отлаженные годами утилиты ОС, объединяя их логику в единый, элегантный скрипт автоматизации, который легко поддерживать и масштабировать.


5. Интерактивное взаимодействие и обработка данных в реальном времени

До сих пор мы рассматривали запуск процессов как некую «атомарную» операцию: отправили команду, дождались завершения, получили результат. Однако в реальной жизни автоматизации мы часто сталкиваемся с долгоживущими процессами — серверами, базами данных или скриптами сбора логов, которые работают непрерывно. Модуль subprocess предлагает объект Popen, который дает нам гораздо больше контроля, чем метод run. Если run — это удобная обертка для большинства задач, то Popen — это низкоуровневый инструмент, позволяющий управлять процессом на лету.

Когда мы создаем экземпляр subprocess.Popen, управление возвращается нам немедленно. Мы можем записывать данные в stdin процесса, читать его stdout и stderr порциями, а также проверять состояние процесса через метод .poll(). Это критически важно для создания интерактивных утилит. Например, если вы автоматизируете взаимодействие с консольным приложением, требующим ввода пароля или подтверждения, использование communicate() становится обязательным. Как говорит Corey Schafer, способность гибко управлять потоками ввода-вывода — это именно то, что превращает скрипт из простого последовательного набора команд в полноценный инструмент системного администрирования. Важно понимать, что при работе с Popen мы берем на себя ответственность за корректное завершение процесса: забытый открытый процесс может привести к утечке ресурсов или «зомби-процессам» в системе.

Использование process.communicate() позволяет безопасно передать данные в процесс и дождаться его завершения, предотвращая «дедлоки» (взаимные блокировки), которые могут возникнуть при переполнении буферов пайпов. Если ваш скрипт ожидает вывода от команды, которая генерирует гигабайты данных, чтение всего потока в оперативную память может быть опасным. В таких случаях лучше использовать итераторы для чтения строк по мере их поступления: for line in iter(process.stdout.readline, b''):. Это позволяет обрабатывать огромные логи без остановки выполнения программы. В профессиональной разработке это называется «потоковой обработкой» (streaming), и умение применять ее в Python экономит колоссальное количество ресурсов сервера.

Цитата: «The Popen constructor is the underlying mechanism that provides a lot of flexibility when you need more control than the simple run method provides. It opens up the world of interactive subprocess management where you can respond to process output in real time rather than waiting for the final result». Эти слова подчеркивают, что переход на Popen — это шаг от «скриптинга» к системному программированию, где вы управляете жизненным циклом внешних программ.

✅ Сделайте сейчас: Используйте subprocess.Popen(['ping', '-c', '4', 'google.com'], stdout=subprocess.PIPE, text=True). Вместо run, используйте цикл for для чтения process.stdout построчно и выводите каждую строку с префиксом «ЛОГ:». Убедитесь, что после цикла вы корректно закрываете процесс через process.wait().

6. Безопасность и архитектурные паттерны при вызове команд

Одной из наиболее критических проблем при использовании subprocess является безопасность. Передача пользовательского ввода напрямую в командную строку через shell=True — это классическая уязвимость «Command Injection». Представьте, что вы берете имя файла от пользователя и выполняете os.system(f"rm {filename}"). Если пользователь введет file.txt; rm -rf /, ваш скрипт превратится в инструмент разрушения собственной системы. Именно поэтому использование списка аргументов является не просто «хорошим тоном», а жестким требованием промышленного кода.

Когда мы передаем список, например ['ls', '-l', path], Python (и операционная система) воспринимают каждый элемент списка как отдельный аргумент команды, а не как часть исполняемой строки. Это гарантирует, что даже если в path содержатся спецсимволы вроде ;, & или |, они будут интерпретированы буквально как имя файла или папки. Corey Schafer неоднократно делает акцент на этом: «Avoiding shell=True whenever possible is the first rule of secure process management, because it effectively neutralizes the risk of malicious input injection». Это золотое правило для любого инженера: если вы можете решить задачу без shell=True, вы обязаны это сделать.

В архитектурном плане, я рекомендую оборачивать вызовы subprocess в специализированные классы-обертки или функции-фабрики. Вместо того чтобы разбрасывать вызовы subprocess.run по всему коду, создайте модуль commands.py, где будут определены функции вроде execute_backup(path) или get_system_uptime(). Это позволяет централизованно управлять параметрами выполнения: логированием, обработкой ошибок и таймаутами. Кстати, о таймаутах: всегда используйте аргумент timeout в subprocess.run. В противном случае ваш скрипт может зависнуть навсегда, если внешняя команда (например, сетевой запрос curl) перестанет отвечать. Установка таймаута позволяет корректно прервать процесс и выбросить исключение TimeoutExpired, которое вы сможете обработать в блоке try-except, отправив уведомление администратору о «зависшем» процессе. Профессиональный код всегда предполагает, что любая внешняя система может упасть, зависнуть или вернуть мусор, и именно грамотная настройка параметров subprocess делает ваш продукт надежным и отказоустойчивым.

Цитата: «Security is about minimizing the attack surface of your scripts, and by bypassing the shell, you ensure that external tools interact with your input only as intended by the system's design. This approach turns unpredictable shell execution into a controlled, verifiable procedure». Это напоминание о том, что чистота кода напрямую коррелирует с защищенностью всей IT-инфраструктуры, которую вы обслуживаете.

✅ Сделайте сейчас: Напишите функцию run_safe_command(cmd_list, timeout_sec=5), которая вызывает subprocess.run с заданным списком аргументов и таймаутом. Добавьте блок try-except для обработки subprocess.TimeoutExpired. Протестируйте функцию с командой ['sleep', '10'] и убедитесь, что скрипт корректно завершается через 5 секунд с вашим сообщением об ошибке.


7. Обработка ошибок и управление состоянием процесса

В профессиональной разработке автоматизаций недостаточно просто запустить команду и надеяться на успех. Любая внешняя зависимость — это потенциальная точка отказа. Метод subprocess.run предоставляет удобный механизм анализа результата через объект CompletedProcess. Как подчеркивает Corey Schafer, понимание кодов возврата (return codes) — это фундамент надежного ПО. Код 0 стандартно означает «успех», тогда как любое иное значение (обычно от 1 до 255) сигнализирует о специфической ошибке, определенной разработчиком утилиты. Если вы игнорируете эти коды, ваш скрипт может продолжить выполнение, основываясь на пустых или поврежденных данных, что приведет к «логическим ошибкам», которые гораздо сложнее отлаживать, чем обычные исключения.

Когда мы используем параметр check=True, Python берет на себя роль «контролера», автоматически выбрасывая исключение CalledProcessError, если процесс завершился с ненулевым кодом. Это отличный паттерн для критически важных задач, таких как миграция баз данных или деплой кода, где выполнение следующего шага при ошибке предыдущего недопустимо. Однако, в некоторых случаях, например, при проверке существования файлов или сетевой доступности через ping, мы ожидаем, что команда может вернуть ошибку. В таких ситуациях профессионалы предпочитают ручную проверку p.returncode. Corey Schafer отмечает: «If you only wanted to proceed if that command was successful, then you could put in a conditional if you wanted to». Это позволяет гибко реагировать: например, записать ошибку в лог и перейти к выполнению запасного плана (fallback), вместо того чтобы аварийно завершать всю программу.

Еще один важный аспект — работа с stderr. Часто новички забывают, что вывод об ошибках направляется в отдельный поток. Если вы захватываете только stdout, вы рискуете потерять информацию о том, почему именно команда провалилась. Настройка stderr=subprocess.PIPE позволяет программно анализировать текст ошибки. Например, можно распарсить строку «No such file or directory» и на основе этого выдать пользователю более понятное сообщение, чем просто «Command failed». Помните, что stderr также может содержать предупреждения, которые не являются критическими. Умение различать «тихие ошибки» и «фатальные сбои» — признак зрелого инженера.

Цитата: «The return code will show us whether we got any errors or not, and a way that I like to remember that is to think of that as meaning zero errors. It is essential to programmatically handle these failures rather than assuming the system is always in the state you expect it to be». Этот подход превращает ваш код из хрупкого набора инструкций в надежную систему, способную самостоятельно диагностировать проблемы окружения.

✅ Сделайте сейчас: Напишите скрипт, который пытается удалить файл, которого не существует. Захватите stderr, преобразуйте его в строку, и если в сообщении содержится слово «No such file», выведите в консоль дружелюбное предупреждение: «Файл не найден, пропуск операции очистки», вместо вывода стандартного трейсбэка Python.

8. Архитектурная чистота: Инкапсуляция и масштабирование

По мере роста проекта количество вызовов внешних утилит неизбежно увеличивается. Если вы будете писать subprocess.run в каждом файле проекта, вы столкнетесь с проблемой поддержки: изменение пути к исполняемому файлу или добавление общих флагов (например, таймаутов) потребует правок в десятках мест. В промышленной разработке мы применяем паттерн инкапсуляции. Создание специализированных функций-адаптеров для каждой системной утилиты позволяет скрыть сложность работы с subprocess и предоставить остальному коду чистый Python-интерфейс.

Представьте, что вам нужно часто вызывать git status. Вместо того чтобы каждый раз писать список аргументов, вы создаете функцию get_git_status(), которая внутри себя обрабатывает вызов, кодировку и проверку ошибок. Corey Schafer подчеркивает, что это «делает ваш скрипт связующим звеном между разрозненными системными утилитами». Инкапсуляция также позволяет внедрять централизованное логирование. Если все вызовы проходят через одну точку, вы можете легко добавить запись в лог-файл (время старта, аргументы, время выполнения, код завершения) для всех операций в системе. Это бесценно при поиске «багов», которые воспроизводятся только в определенных системных окружениях.

Также важно помнить о кроссплатформенности. Как упоминает спикер, на Windows dir требует shell=True, тогда как на Linux это ls. Хороший архитектор создает «абстрактный слой» (фабрику), которая определяет ОС в рантайме и подставляет нужные команды. Это делает ваш инструмент универсальным. Если вы планируете масштабировать свое приложение, обязательно выделите subprocess в отдельный слой абстракции — так называемый «System Interaction Layer». Это обеспечит чистоту кода (Clean Code) и позволит вам легко заменять системные утилиты на более современные библиотеки в будущем без переписывания бизнес-логики.

Цитата: «It's definitely useful to know how to pass in the input to different external commands because you know if you are doing step-by-step processing. By encapsulating these calls, you ensure that your main application logic remains clean and detached from the underlying OS-specific implementation details». Это ключ к созданию поддерживаемых систем, которые живут годами, несмотря на обновления ОС и изменение требований.

✅ Сделайте сейчас: Создайте модуль utils.py с функцией call_sys_tool(tool_name, args). Функция должна проверять текущую ОС (через platform.system()) и автоматически добавлять shell=True, если ОС — Windows. Используйте эту функцию в основном скрипте для вызова ls (или dir для Windows), чтобы продемонстрировать кроссплатформенную абстракцию.

🏋️ Практикум

  1. Базовый уровень: Вызовите команду echo с параметром «Hello World» и сохраните результат в переменную.
  2. Обработка данных: Получите список всех процессов в системе (команда ps aux для Linux/macOS или tasklist для Windows) и отфильтруйте его в Python, оставив только строки, содержащие «python».
  3. Работа с файлами: Направьте вывод команды date в файл current_date.txt, используя контекстный менеджер open.
  4. Безопасность: Попробуйте запустить команду, содержащую метасимволы (например, ; ls), передав их в subprocess.run как список, чтобы убедиться, что они интерпретируются как аргументы, а не команды.
  5. Управление таймаутами: Вызовите sleep 20 с таймаутом в 3 секунды и обработайте исключение TimeoutExpired.
  6. Потоковая обработка: Используйте Popen для чтения вывода команды, которая генерирует поток текста, и выводите его в консоль с задержкой в 0.5 секунды между строками.

🏋️ Практикум

0 / 4 выполнено

Захват и анализ системной информации

⏱ 15 мин 🎯 Цель: научиться перехватывать вывод команды и проверять его статус. Шаги: 1. Выполните команду 'ls -la'. 2. Захватите вывод в переменную. 3. Проверьте returncode. 4. Распечатайте вывод в виде текста. ✅ Результат: скрипт, выводящий содержимое папки в формате строки.

Создание лог-файла процесса

⏱ 15 мин 🎯 Цель: автоматическое сохранение системных отчетов. Шаги: 1. Откройте файл 'output.txt' в режиме записи. 2. Перенаправьте стандартный вывод команды в этот файл. 3. Проверьте наличие файла. ✅ Результат: файл output.txt с результатами выполнения системной команды.

Обработка ошибок через исключения

⏱ 10 мин 🎯 Цель: научиться контролировать критические сбои. Шаги: 1. Попробуйте вызвать несуществующую команду или директорию. 2. Добавьте check=True. 3. Оберните вызов в try-except. ✅ Результат: скрипт, корректно обрабатывающий ошибку выполнения через блок try-except.

Конвейерная обработка данных

⏱ 20 мин 🎯 Цель: научиться передавать данные между процессами. Шаги: 1. Прочитайте файл через 'cat'. 2. Передайте этот вывод команде 'grep'. 3. Выведите результат поиска на экран. ✅ Результат: работающий конвейер фильтрации текста с использованием Python.
🎉
Все задания выполнены!
Отлично — знания превращены в навыки

💬 Цитаты (3)

«Если вы используете shell=True, это может создать угрозу безопасности при обработке ненадежных данных. Используйте этот параметр только тогда, когда аргументы заданы вами напрямую, и избегайте передачи пользовательского ввода.» #

Важность безопасности при работе с системными вызовами.

«Код завершения покажет, были ли ошибки в ходе выполнения. Я запоминаю это так: 0 — значит ноль ошибок.» #

Простое мнемоническое правило для проверки успешности завершения процесса.

«Когда мы устанавливаем capture_output=True, в фоновом режиме Python направляет стандартный вывод и стандартную ошибку в пайп, что позволяет нам перехватывать эти значения.» #

Понимание механизма работы аргумента capture_output.

Похожие по теме

Читать далее

Мастерство Asynchronous Programming: от основ до высокопроизводительных приложений на Python

Corey Schafer

Мастерство Asynchronous Programming: от основ до высокопроизводительных приложений на Python

Corey Schafer

Понравился экстракт?
Подписывайтесь — лучшие материалы каждую неделю.
Telegram Дайджест →

Поделитесь с коллегами

Telegram ВКонтакте X / Twitter
Открыть в Telegram

Экстракт Знаний в Telegram

Экстракты и дистилляты из лучших YouTube-каналов — сразу после публикации.

Подписаться

Дайджест Экстрактов

Лучшие методички за неделю — каждый понедельник