Действительно ли возможно указать уникальное имя к окнам терминала для выполнения команды с помощью Python?

Я должен выполнить терминальные коды через os.system() в Python. Две команды должны быть выполнены в двух терминалах отдельно. Действительно ли возможно указать уникальное имя / идентификатор к окнам терминала для выполнения каждой команды в ее указанном окне терминала?

3
задан 10 April 2018 в 04:04

1 ответ

Каждый терминал, который Вы открываете, получает исключительно пронумерованный файл (ведомое устройство псевдотерминала (PTS) устройство, чтобы быть точным) в /dev/pts/ с кем это может быть распознано и обращено. Для получения соответствующего имени файла окна терминала, можно использовать, например. tty (см. этот ответ для альтернатив; читать man pts для больше):

$ tty
/dev/pts/4

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

$ echo test >/dev/pts/4  # run anywhere
test                     # printed in terminal window 4

Вы не можете действительно выполнить команду в другом терминале, просто потому что это не терминал, который выполняет команду, а скорее оболочку, которая обычно работает в терминале. Можно однако эмулировать поведение команды, выполненной в окне терминала с перенаправлениями следующим образом (взятый от псевдотерминалов Linux: выполнение строки, отправленной от одного терминала в другом):

echo test </dev/pts/4 &>/dev/pts/4

Если Вы хотите отобразить команду, Вы работали также, я повторно управляю записью функции (Как я использую $* при исключении определенных входных переменных как 1$ и 2$ в сценарии удара?), например:

run_in(){
  t=/dev/pts/$1 &&
  echo "${*:2}" >$t &&
  eval "${@:2}" <$t &>$t
}

В одной строке:

run_in(){ t=/dev/pts/$1&&echo "${*:2}" >$t&&eval "${@:2}" <$t &>$t;}

Используйте его как так:

$ run_in 4 echo test  # run anywhere
$ echo test           # printed in terminal window 4 (if prompt was already there)
test                  # printed in terminal window 4

В этом сценарии единственные неизвестные /dev/pts/? числа, которые должна использовать Ваша программа Python. Один возможный способ получить эти числа состоит в том, чтобы запустить Ваши собственные окна терминала, которые произведут их 'числа' в в файл, затем можно считать его [касательно]. Давайте предположим, что Вы используете gnome-terminal, соответствующая часть кода Python могла быть чем-то следующим образом [касательно]:

#!/usr/bin/python
import os
import subprocess

os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'")
my_terminal_1 = subprocess.Popen(["cat", "/tmp/my-app-tty-1"], stdout=subprocess.PIPE).communicate()[0]
command = "echo Test on: $(date) >" + my_terminal_1
print my_terminal_1
print command
os.system(command)

Если это - сценарий Perl [касательно]

#!/usr/bin/perl
os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'");
my $my_terminal_1 = `cat /tmp/my-app-tty-1`;
my $command = "echo Test on: \$\(date\) > $my_terminal_1";
print ("$my_terminal_1");
print ("$command");
os.system("$command");
4
ответ дан 1 December 2019 в 15:50

Другие вопросы по тегам:

Похожие вопросы: