Я должен выполнить терминальные коды через os.system()
в Python. Две команды должны быть выполнены в двух терминалах отдельно. Действительно ли возможно указать уникальное имя / идентификатор к окнам терминала для выполнения каждой команды в ее указанном окне терминала?
Каждый терминал, который Вы открываете, получает исключительно пронумерованный файл (ведомое устройство псевдотерминала (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");