0Pricing
Python Academy · Урок

Перехват вывода

Читайте stdout и stderr

«Перехват вывода» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Перехват стандартного вывода

Чтобы прочитать вывод команды, передайте capture_output=True. Текст появится в атрибуте результата stdout.

import subprocess

cp = subprocess.run(['echo', 'hello'], capture_output=True)
print(cp.stdout)

Байты и текст

По умолчанию вывод представлен байтами. Передайте text=True, чтобы вместо этого получить декодированные строки — обычно это именно то, что Вам нужно.

import subprocess

cp = subprocess.run(['echo', 'hello'], capture_output=True, text=True)
print(repr(cp.stdout))

Удаление завершающей новой строки

Вывод команды часто заканчивается символом новой строки. Используйте .strip(), чтобы удалить его перед дальнейшим использованием значения.

import subprocess

cp = subprocess.run(['echo', 'value'], capture_output=True, text=True)
clean = cp.stdout.strip()
print('[' + clean + ']')

Перехват стандартной ошибки

Ошибки обычно выводятся в stderr, который перехватывается отдельно. Это позволяет различать обычный вывод и сообщения об ошибках.

import subprocess

cp = subprocess.run(['ls', '/no/such/dir'], capture_output=True, text=True)
print('stdout:', repr(cp.stdout))
print('stderr:', cp.stderr.strip())

Использование вывода в коде

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

import subprocess

cp = subprocess.run(['printf', 'a\nb\nc\n'], capture_output=True, text=True)
lines = cp.stdout.splitlines()
print('line count:', len(lines))
print(lines)

Перенаправление стандартной ошибки в стандартный вывод

Чтобы объединить вывод ошибок с обычным выводом, установите stderr=subprocess.STDOUT. После этого оба потока появятся в stdout.

import subprocess

cp = subprocess.run(['ls', '/no/such/dir'], stdout=subprocess.PIPE,
                    stderr=subprocess.STDOUT, text=True)
print(cp.stdout.strip())

Передача ввода

Передайте данные команде через стандартный ввод с помощью аргумента input. Здесь мы передаём текст в cat.

import subprocess

cp = subprocess.run(['cat'], input='piped in\n', capture_output=True, text=True)
print(cp.stdout.strip())

Сокращённая форма check_output

subprocess.check_output() запускает команду и напрямую возвращает её стандартный вывод, вызывая исключение при сбое. Это удобная однострочная запись для перехвата вывода.

import subprocess

out = subprocess.check_output(['echo', 'quick'], text=True)
print(out.strip())

Отбрасывание вывода

Чтобы подавить вывод команды, перенаправьте её потоки в subprocess.DEVNULL.

import subprocess

cp = subprocess.run(['echo', 'silent'], stdout=subprocess.DEVNULL)
print('return code only:', cp.returncode)

Обработка ошибок вместе с выводом

При использовании check=True вызванное исключение CalledProcessError всё равно содержит перехваченные output и stderr для диагностики.

import subprocess

try:
    subprocess.run(['ls', '/missing'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
    print('failed:', e.returncode)
    print('stderr:', e.stderr.strip())

Объединение всех элементов

Обычно вспомогательная функция запускает команду, проверяет успешность и возвращает очищенный текст. Так выглядит распространённый шаблон.

import subprocess

def capture(cmd):
    cp = subprocess.run(cmd, capture_output=True, text=True, check=True)
    return cp.stdout.strip()

print(capture(['echo', 'final result']))

Быстрая проверка

Проверьте, насколько хорошо Вы поняли перехват вывода.

Итоги

Вы научились перехватывать вывод:

  • capture_output=True вместе с text=True возвращают строковые значения stdout и stderr.
  • Объединяйте потоки с помощью stderr=subprocess.STDOUT, а подавляйте вывод с помощью DEVNULL.
  • Передавайте ввод через input=; check_output — это сокращённая форма.
  • Исключения содержат перехваченный вывод для отладки.

Далее: чтение переменных окружения и модуль os.

Часто задаваемые вопросы

Урок «Перехват вывода» бесплатный?

Да — полный текст урока «Перехват вывода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Перехват вывода»?

Читайте stdout и stderr Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Перехват вывода»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Запуск команд с subprocess
  2. Перехват вывода
  3. Окружение и модуль os
  4. shutil для операций с файлами
← Назад к Python Academy