#python #linux #ubuntu
#python #linux #ubuntu
Вопрос:
Предположим, у меня есть какой-то открытый терминал, который работает независимо от моего скрипта python. Возможно ли каким-либо образом прослушать этот стандартный вывод терминала?
Комментарии:
1. Если вы запустите этот терминал из скрипта Python через
subprocess
модуль, вы сможете читать и записывать через коррелированный КАНАЛ. Проверьте docs.python.org/3/library/subprocess.html для получения дополнительной информации.2. Да, я знаю это, но терминал, который я хочу прослушать, не зависит от скрипта python.
3. Тогда я не думаю, что вы можете. Если процесс запущен в другом месте, вы не сможете подключиться к его потокам, это будет похоже на захват.
4. хорошо, я понимаю
5. @omEchan если у вас есть доступ к этому терминалу, вы можете скопировать его стандартный вывод в файл , а затем заставить ваш скрипт Python непрерывно читать этот файл.
Ответ №1:
Если вам нужен точный процесс, который вам нужно захватить, вы можете использовать strace
.
Предположим, что у вас есть два терминала. С 1-го терминала запустите ping
команду.
ping google.com
PING google.com (xxx.xxx.xxx.xxx) 56(84) bytes of data.
64 bytes from muc11s14-in-f14.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=116 time=11.5 ms
64 bytes from muc11s14-in-f14.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=2 ttl=116 time=10.9 ms
64 bytes from muc11s14-in-f14.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=3 ttl=116 time=11.3 ms
64 bytes from muc11s14-in-f14.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=4 ttl=116 time=11.4 ms
...
Теперь переключитесь на 2-й терминал и запустите:
strace -e trace=write -s1000 -fp $(pgrep ping)
strace: Process 765549 attached
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=4 ttl=116 time=11.4 msn", 91) = 91
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=5 ttl=116 time=11.2 msn", 91) = 91
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=6 ttl=116 time=11.3 msn", 91) = 91
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=7 ttl=116 time=11.5 msn", 91) = 91
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx8): icmp_seq=8 ttl=116 time=11.4 msn", 91) = 91
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=9 ttl=116 time=11.5 msn", 91) = 91
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=10 ttl=116 time=11.3 msn", 92) = 92
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=11 ttl=116 time=11.5 msn", 92) = 92
...
На данный момент у нас есть выходные данные другого терминала. Давайте перейдем к части python.
from subprocess import Popen, PIPE, STDOUT, check_output
import shlex
process_id = check_output(shlex.split("pgrep ping"), text=True).strip()
p = Popen(
shlex.split("strace -e trace=write -s1000 -fp {0}".format(process_id)),
stdin=PIPE, stdout=PIPE, stderr=STDOUT, text=True
)
for line in p.stdout:
print(line.strip())
Повторяя p.stdout
, вы получите вывод процесса другого терминала.
strace: Process 765549 attached
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=732 ttl=116 time=11.4 msn", 93) = 93
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=733 ttl=116 time=11.3 msn", 93) = 93
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=734 ttl=116 time=11.4 msn", 93) = 93
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=735 ttl=116 time=11.5 msn", 93) = 93
write(1, "64 bytes from ber01s08-in-f238.1e100.net (xxx.xxx.xxx.xxx): icmp_seq=736 ttl=116 time=11.3 msn", 93) = 93