Как получить вывод консоли python

Обновлено: 04.07.2024

Python | Получить вывод консоли Windows с помощью Python

В приведенном выше коде используется os.popen() Команда получает вывод консоли.

Различия между функциями os.system и os.popen

  • Обе функции выполняют системные инструкции в параметрах
  • Возвращаемое значение команды os.system - это код статуса выхода системы.
  • Возвращаемое значение команды os.popen - это вывод консоли.

Стандарт PEP324В, предлагается использовать subprocess Замена модуля os.system с os.popen И другие функции. на практике, subprocess Модуль тоже лучше, чем os.popen Такие функции имеют лучшую производительность, особенно при многопоточной разработке.

Самый важный класс в этом модуле - это класс Popen.

Обычно используемые параметры:

args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence or string, but can be explicitly set by using the executable argument.

stdin , stdout and stderr specify the executed programs' standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created. With None, no redirection will occur; the child's file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the applications should be captured into the same file handle as for stdout.

If shell is true, the specified command will be executed through the shell.

If cwd is not None, the current directory will be changed to cwd before the child is executed. ( cwd means current working directory)

If env is not None, it defines the environment variables for the new process.

часто используемые способы:

poll() : Check if child process has terminated. Returns returncode attribute.

wait() : Wait for child process to terminate. Returns returncode attribute.

communicate(input=None)
Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional stdin argument should be a string to be sent to the child process, or None, if no data should be sent to the child.

communicate() returns a tuple (stdout, stderr).

Note: The data read is buffered in memory, so do not use this method if the data size is large or unlimited.

Если вы используете модуль подпроцесса для реализации функций первого раздела, код будет следующим:

Проблема перекодировки вывода подпроцесса

В приведенном выше примере кода мы заметили, что последняя строка кода использует декодирование формата GBK. Как мы определяем формат декодирования?

Формат вывода подпроцесса соответствует формату вывода командной строки, а формат вывода командной строки можно запросить следующим образом:

Выполнить в командной строке chcp Инструкция, получите Код страницы активности . Например, результат выполнения на моем компьютере выглядит следующим образом.

Затем проверьте доступные коды набора символов в соответствии со следующей таблицей.

MS-DOS предоставляет наборы символов для следующих стран и языков:
Описание кодовой страницы
1258 вьетнамский
1257 Балтийский
1256 арабский
1255 Еврейский
1254 турецкий
1253 греческий
1252 1 символ латинского алфавита (ANSI)
1251 кириллица
1250 центральноевропейских языков
950 (традиционный китайский)
949 корейский
936 упрощенный китайский (по умолчанию) GBK
932 на японском
874 тайский
850 многоязычных (MS-DOS Latin1)
437 MS-DOS Американский английский
65001 UTF-8

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

Python предоставляет программисту инструменты, позволяющие не просто выводить данные в консоль, но и форматировать их.

Функция print и её параметры

Функция print() включена в стандартную библиотеку языка Python, как основной инструмент для вывода данных в консоль или любое другое устройство (экран, принтер и так далее).

Программист может настраивать вывод данных, используя аргументы функции:

*objects

Это данные, которые выводятся на экран. Программист передает в функцию сколько угодно объектов, которые автоматически преобразуются в строковый формат и направляются в поток вывода.

Передавая объекты в функцию, программист может их передавать через запятую или использовать конкатенацию. Передача нескольких аргументов не приведёт к конфликту между *objects и другими необязательными аргументами, потому что интерпретатор автоматически распознаёт остальные параметры по ключевому слову (sep, end, file, flush)!

Вот пример:

Вот пример:

Вот пример скрипта на Python, который откроет файл temp.txt и запишет в него текст с помощью функции print:

flush

Аналогично и с выводом в консоль, данные записываются в буфер и выводятся из него в консоль. Если flush выставлен в True, то вывод производится немедленно.

Форматированный вывод

Для того чтобы выведенную в консоль информацию можно было без проблем прочитать и понять, она должна быть форматирована. Python предоставляет программисту инструменты, позволяющие форматировать вывод в консоль разными способами. С их помощью можно даже создать ровную и читаемую таблицу.

Оператор %

Помимо символа % указывается тип значения, а также, по желанию, длина и точность. Синтаксис выглядит так:

Если рассмотреть пример, можно увидеть, что:

Метод format

Подставляемые значения указываются в кортеже после ключевого слова format. Их можно указывать как позиционно, так и присваивать по имени. Пример:

Метод format также позволяет форматировать числа, то есть указывать их ширину и точность:

Этот способ позволяет очень гибко форматировать вывод данных. Например, программист может передавать в строку данные из готового словаря:

Строковый метод

Вывод с помощью строкового метода формируется с использованием операций среза и методов строк. Для работы со строковым типом данных создано несколько методов, которые позволяют просто и изящно форматировать вывод, среди них методы: ljust() , rjust() , center() .

centre()

Эта функция выравнивает строку по центру в соответствии с указанной шириной, заполняя недостающую ширину пробелами. Она имеет следующий синтаксис:

Здесь:

Пример:

Важно понимать, что функция располагает текст не в центре консоли, а в центре поля указанной ширины (в примере это 50 символов).

Если поменять символ заполнения, получится следующее:

ljust()

Метод работает аналогично centre() , только выравнивает текст не по центру, а по левому краю. То есть недостающие символы дополняются не с двух сторон, а только с правой.

rjust()

Метод работает аналогично centre() , но выравнивает текст по правому краю. То есть символы дополняются только с левой стороны.

f-строки

Поля заданной ширины

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

Поля заданной ширины жизненно необходимы для вывода в консоль таблиц или двумерных массивов. Из-за разной длинный элементов столбцы искривляются, что приводит к потери читаемости, однако если использовать поля заданной ширины, то пока длинны значений меньше, чем ширина поля, все они будут располагаться строго друг под другом.

Примеры

С помощью форматированного вывода можно полностью настроить любой вывод в консоль, например:

Вывод ошибки

Вывод списка

Ниже пример того как выводится список в одну строку:

Если нужно перечислить элементы списка в столбик с указанием порядковых номеров, то это можно сделать следующим образом:

Вывод массива

Здесь выводим массив построчно с указанием номеров элементов.

Вывод словаря

Здесь приведём два варианта для словарей.

Простой вариант:

В виде таблицы:

Вывод матрицы

Сложность в выводе матрицы состоит в том, что из-за разных длин чисел элементы столбца будут стоять не друг под другом, а со смещением. С помощью форматирования можно решить эту проблему.

Здесь мы создали матрицу в виде двумерных списков, но если вы работаете с матрицами с помощью библиотеки NumPy, то там вывод в консоль форматируется автоматически.

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

К счастью, мы можем использовать Python вместо сценариев оболочки для автоматизации. Python предоставляет методы для запуска команд оболочки, предоставляя нам ту же функциональность, что и сценарии оболочки. Изучение того, как выполнять команды оболочки в Python, открывает нам возможность автоматизировать компьютерные задачи структурированным и масштабируемым образом.

В этой статье мы рассмотрим различные способы выполнения команд оболочки в Python и идеальную ситуацию для использования каждого метода.

Использование os.system для запуска команды

Python позволяет нам немедленно выполнить команду оболочки, которая хранится в строке, используя функцию os.system() .

Давайте начнем с создания нового файла Python с именем echo_adelle.py и введите следующее:

Первое, что мы делаем в нашем Python файле, это импортируем модуль os , который содержит функцию system , которая может выполнять команды оболочки. Следующая строка делает именно это, запускает команду echo в нашей оболочке через Python.

В вашем терминале запустите этот файл с помощью следующей команды, и вы должны увидеть соответствующий вывод:

По мере того, как команды echo выводятся в наш stdout , os.system() также возвращает код завершения команды оболочки. Код 0 означает, что он работает без проблем, а любое другое число означает ошибку.

Давайте создадим новый файл с именем cd_return_codes.py и введите следующее:

В этом сценарии мы создаем две переменные, в которых хранятся результаты выполнения команд, которые изменяют каталог на домашнюю папку и на несуществующую папку. Запустив этот файл, мы увидим:

Первая команда, которая изменяет каталог на домашний каталог, выполняется успешно. Следовательно, os.system() возвращает код ноль, который хранится в home_dir . С другой стороны, unknown_dir сохраняет код завершения неудачной команды bash, чтобы изменить каталог на несуществующую папку.

Функция os.system() выполняет команду, печатает любой вывод команды на консоль и возвращает код завершения команды. Если нам нужно более детальное управление вводом и выводом команды оболочки в Python, мы должны использовать модуль subprocess .

Выполнение команды с подпроцессом

Модуль subprocess - это рекомендуемый Python способ выполнения команд оболочки. Это дает нам гибкость для подавления вывода команд оболочки или цепочки входов и выходов различных команд вместе, в то же время обеспечивая аналогичный опыт os.system() для базовых сценариев использования.

В новом файле с именем list_subprocess.py напишите следующий код:

Примечание: Как правило, вам нужно отделить аргументы , основанные на пространстве, например , ls -alh будет ["ls", "-alh"] , а ls -a -l -h , превратится в ["ls", "-a", -"l", "-h"] .

Запустите этот файл, и вывод вашей консоли будет похож на:

Стандартный вывод команды теперь передается на специальное устройство /dev/null , что означает, что вывод не будет отображаться на наших консолях. Запустите файл в вашей оболочке, чтобы увидеть следующий вывод:

Мы используем довольно много параметров, давайте рассмотрим их:

Запуск этого файла приводит к следующему выводу:

Мы также можем бросить Exception без проверки значения возврата. В новом файле false_subprocess.py добавьте код ниже:

В вашем терминале запустите этот файл. Вы увидите следующую ошибку:

Используя check=True , мы сообщаем Python, что нужно вызывать любые исключения, если возникает ошибка. Так как мы столкнулись с ошибкой, оператор print в последней строке не был выполнен.

Выполнение команды с Popen

Класс subprocess.Popen предоставляет больше возможностей для разработчика при взаимодействии с оболочкой. Тем не менее, мы должны быть более точными в получении результатов и ошибок

По умолчанию subprocess.Popen не останавливает обработку программы Python, если ее команда не завершила выполнение. В новом файле с именем list_popen.py введите следующее:

Этот код эквивалентен list_subprocess.py . Он запускает команду с помощью subprocess.Popen и ожидает ее завершения, прежде чем выполнить оставшуюся часть сценария Python.

Допустим, мы не хотим ждать завершения выполнения команды оболочки, чтобы программа могла работать над другими вещами. Как узнать, когда команда оболочки закончила выполнение?

Метод poll() возвращает код завершения, если команда закончит работу, или None если он все еще выполняется. Например, если бы мы хотели проверить, завершено ли list_dir , а не ждать его, у нас была бы следующая строка кода:

Для управления вводом и выводом subprocess.Popen нам нужно использовать метод communicate() .

В новый файл с именем cat_popen.py добавьте следующий фрагмент кода:

Метод communicate() принимает аргумент input , который используется для передачи входных данных команде оболочки. Метод communicate также возвращает stdout и stderr когда они установлены.

Мы рассмотрели три способа запуска команд оболочки в Python с использованием класса subprocess.Popen . Давайте еще раз рассмотрим их характеристики, чтобы узнать, какой метод лучше всего подходит для требований проекта.

Какой из них я должен использовать?

Вот таблица с некоторыми различиями в юзабилити, которые вы также можете использовать для обоснования своего решения:

В статье узнаем как в Python 3, с помощью встроенной функции print(), вывести текст на консоль. А для закрепления напишем небольшую программу.

Первая программа

По традиции первая программа должна выводить на экран консоли фразу “Hello World!”. Мы не будем отходить от традиции. Вот код этой программы:

Функция print() – это встроенная функция, то-есть она заранее определена. Используя Python 3 вы можете создавать и собственные функции.

Эта функция в качестве аргументов принимает строки и выводит их на консоль, или может сохранить их в файл. То есть мы попросили Python вывести на экран строку “Hello, World!”, что он и сделал:


Строка обязательно должна быть написана в кавычках!

Вывод нескольких строк

В предыдущем примере мы выводили только одну строку – “Hello, World!”. Но функция print() может принимать несколько аргументов и выводить несколько строк. Для этого строки разделяются с помощью запятой.


Вот пример кода:

А вот что делает этот код:

Необязательные параметры

Помимо строк функция print() может использовать необязательные параметры:

  • sep – с помощью этого параметра вы можете указать разделитель строк. А по умолчанию в качестве разделителя используется пробел;
  • end – этот параметр позволяет указать, что нужно добавить после последней строки. По умолчанию добавляется управляющий символ ‘\n’ (перевод строки);
  • file – по умолчанию функция print() выводит строки на консоль, а с помощью этого параметра можно поместить строки в файл.

Параметр sep

Следующий код выводит две строки и разделяет их символом перевода строки:

Вот как это работает:

Параметр end

Если мы выводим две строки с помощью двух функций priint(), то они будут на разных строках. Это происходит потому что, по умолчанию, после каждой последней строки ставится знак перевода строки. Вот пример кода:

А вот его выполнение:

А теперь используем параметр end и укажем что в конце строки нужно добавлять пробел:

И выполним этот код:

Параметр file

По умолчанию функция print() выводит информацию на консоль. А используя параметр file, мы можем поместить вывод в файл.

Работать с файлами мы пока не умеем, но в коде я оставил комментарии которые должны помочь его понять:

А теперь посмотрим как это сработает:

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

Вывод результатов арифметических операций

Функция print() позволяет в себя поместить другие функции или операторы. Например мы можем вывести результат арифметических операций:

Подробнее математические операции рассмотрим в отдельной статье.

Вывод значений переменных

Ну и конечно мы можем выводить значения переменных. Переменную, также как и операцию, не нужно брать в кавычки, вот пример кода:

Итоговый пример

И для закрепления материала давайте напишем и разберём такую программку:

Вот результат выполнения этой программы:

В официальной документации встроенная в Python функция print() описана здесь.

Читайте также: