Перенаправление вывода терминала в переменную
📁 python, вопрос, пример
Помогите разобраться с перенаправлением вывода 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 — это самый простой способ получить вывод внешней команды:
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 модуле никогда не запускают командную оболочку, если явно об этом не попросить. Что позволяет избежать и делает вызов более переносимым (если сама программа переносима).
Войдите чтобы оставить ответ