аватар question@mail.ru · 01.01.1970 03:00

Перенаправление вывода терминала в переменную

Помогите разобраться с перенаправлением вывода cmd в переменную, т.к. переменной присваивается только exit_code процесса. Для наглядности есть пара примеров: Пример

import sys, os command = ""tasklist""result1 = os.system(command)print(result1) # на выходе получим 0

Пример 2

command = ""tasklist>temp.txt""result2 = os.system(command)print(result2) # на выходе получим 0with open('temp.txt', 'r') as f:    result2 = f.read()    print(result2) # выведет результат выполнения tasklist

Вопрос: можно ли перенаправить вывод терминала windows не используя temp.txt файл, тобиш сразу выгружать значение в переменную.? sys.stdout пробовал.

sys.stdout = open('temp.txt', 'w') #запишет 0 в файлик os.system('tasklist') #сам резульат выполнения будет выведен в интеретатореfile = open('temp.txt', 'r').read()print(file)# выведет 0
аватар answer@mail.ru · 01.01.1970 03:00

— это самый простой способ получить вывод внешней команды:

import subprocessoutput = subprocess.check_output(['программа', 'аргумент 1', '2'])

Всё что программа выводит в стандартный вывод, сохраняется в output. Если программа завершится с ненулевым статусом возврата (как правило на ошибку указывает), то check_output() выбросит исключение (не следует неявно ошибки игнорировать).

Начиная с простого случая существует множество вариаций. К примеру, чтобы получить объединённый вывод как из стандартного потока команды (stdout) так и из потока ошибок (stderr), можно передать stderr=subprocess.STDOUT параметр в check_output(). Дочерний процесс может вообще напрямую в терминал писать в обход своих stdout/stderr, в этом случае на POSIX системах можно pty создать, чтобы перехватить вывод (в таких случаях ).

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

text = subprocess.check_output(['программа', 'аргумент 1', '2'], encoding=encoding)

Подробнее см. .

Стоит упомянуть, что в отличии от старых интерфейсов, унаследованных из Си (таких как system(), popen()), функции в subprocess модуле никогда не запускают командную оболочку, если явно об этом не попросить. Что позволяет избежать и делает вызов более переносимым (если сама программа переносима).

Последние

Похожие