Перехват вывода
Читайте 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 — локальная установка не требуется.