É possível especificar um nome exclusivo para as janelas do terminal para executar o comando via python?

3

Eu tenho que executar códigos de terminal via os.system() no Python. Dois comandos devem ser executados em dois terminais separadamente. É possível especificar um nome / ID exclusivo para as janelas de terminal para executar cada comando em sua janela de terminal especificada?

    
por sc241 09.04.2018 / 19:32

1 resposta

4

Cada terminal que você abre recebe um único arquivo numerado (para ser exato, um dispositivo escravo pseudo-terminal (PTS)) em /dev/pts/ com quem ele pode ser reconhecido e endereçado. Para obter o nome de arquivo correspondente de uma janela de terminal, você pode usar, por exemplo, tty (veja esta resposta para alternativas; leia man pts para mais):

$ tty
/dev/pts/4

Você pode usar esse nome de arquivo, por exemplo, para redirecionar a saída para uma janela de terminal diferente da seguinte forma:

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

Você não pode realmente executar um comando em outro terminal, simplesmente porque não é o terminal que executa um comando, mas sim o shell que normalmente é executado em um terminal. No entanto, você pode emular o comportamento de um comando executado em uma janela de terminal com redirecionamentos da seguinte maneira (tirados de pseudo-terminais do Linux: executando a sequência de caracteres enviada de um terminal em outro ):

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

Se você quiser exibir o comando que você executou também recomendo escrever uma função ( Como eu uso $ * ao omitir determinada entrada variáveis como $ 1 e $ 2 no script bash? ), por exemplo:

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

Em uma linha:

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

Use assim:

$ 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

Neste cenário, os únicos desconhecidos são os números /dev/pts/? que seu programa Python deve usar. Uma maneira possível de obter esses números é lançar suas próprias janelas de terminal, que produzirão seus 'números' em um arquivo, então você pode lê-lo [ ref ] . Vamos supor que você esteja usando gnome-terminal , a parte relevante do código Python poderia ser algo como [ ref ] :

#!/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)

Se for um script em Perl [ ref ]

#!/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");
    
por dessert 09.04.2018 / 20:46