Захват вывода команды запускается в терминале в переменной - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь захватить все данные, которые я получаю из скрипта Python, который я запускаю в переменную. Я взял несколько входных данных от пользователя в сценарии, и я хочу захватить все от начала до конца.

Это почти похоже на это: Выполнение команды оболочки и получение вывода

Но опять же это использует подпроцесс внутри скрипта для получения вывода.

Что я хочу, это примерно так:

когда я запускаю ls -l в терминале, яхочу, чтобы мой сценарий перехватил вывод ls -l

Если я напишу:

p2 = subprocess.Popen('ls' ,'-l',stdout= subprocess.PIPE).communicate()[0])

в моем сценарии, это выполнит сценарий дважды.

Ожидаемый вывод - захватить все данные, когда я запускаю ls -l в терминале, который будет записан в p2.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Вы можете использовать pexpect, чтобы легко открывать PTY и регистрировать все, что он показывает:

#!/usr/bin/env python3
import pexpect
import io

print("-- Running the program")
p = pexpect.spawn("./foo.py")
p.logfile_read = io.BytesIO()
p.interact();

print("-- Program exited. Here is the log:")
log = p.logfile_read.getvalue().decode("utf-8")
print(log)

Вот foo.py:

#!/usr/bin/env python3
name=input("Enter name: ")
print("Hello " + name)

Вот что происходит, когда вы запускаетеэто из терминала:

$ ./foo.py
Enter name: World
Hello World

А вот что происходит, когда вы запускаете его из сценария регистрации:

$ ./log.py
-- Running the program
Enter name: World
Hello World
-- Program exited. Here is the log:
Enter name: World
Hello World
0 голосов
/ 23 октября 2019

Если вы хотите избежать всех хлопот, связанных с использованием subprocess.Popen() явно, просто перейдите на os.popen("command").read() - он запускает первый под капотом, и в моем случае результат p2 = os.popen("ls -l").read() выглядит просто правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...