Como executo um comando em uma nova janela de terminal no mesmo processo que o original?

4

Qual é o equivalente de xfce4-terminal -e bash -c 'myCommand' que não inicia um novo processo com o terminal, mas que ainda abre uma nova janela de terminal para a saída (que também precisará receber entrada)? Eu quero que o terminal original (que não é visível, de qualquer forma) pare até que o novo visível seja feito.

Digamos que eu tenha uma GUI do Python que chame o comando mencionado acima. Eu quero que o script Python pare enquanto a janela de terminal recém-aberta executa seu comando e continue depois que ele parar.

EDIT: Em resposta a pedidos de mais informações sobre a minha situação, aqui está, mais especificamente:

Eu criei um IDE usando o Python 3.x, com o Tkinter como GUI. Não há nenhuma janela de terminal aberta simplesmente porque é um programa baseado em GUI (e se houvesse, seria em segundo plano, de qualquer maneira, e ninguém teria um motivo particular para saber procurar e ver se estava dizendo alguma coisa, já que o IDE inteiro está em uma GUI).

Estou fazendo uma opção para criptografar assimetricamente o texto selecionado usando a ferramenta de linha de comando gpg (que é mais conveniente e documentada do que os módulos Python para meus outros usos mais proeminentes, que estão além do escopo desta questão; além disso, não há tantos problemas de licenciamento com o uso de binários compilados). Para criptografia simétrica, não tenho um problema porque não preciso de uma janela de terminal aberta, mas a criptografia assimétrica tende a solicitar mais coisas que podem ou não ser importantes, e o usuário precisa responder a esses prompts. / p>

O texto a ser criptografado é salvo em um arquivo temporário, e o gpg é para criptografar todo o arquivo (já que o texto pode ser arbitrariamente longo e pode causar problemas se for enviado para um terminal em vez de ser salvo em um arquivo) .

Assim, quando o usuário seleciona texto e executa o método, eu quero que uma janela de terminal apareça com o prompt do gpg. Idealmente, o usuário diria sim ou não e pressionaria enter, e a janela do terminal desapareceria; então o texto selecionado seria substituído por texto criptografado assimetricamente. No entanto, o que realmente acontece é que a janela do terminal aparece e o programa tenta obter o texto criptografado antes de ser realmente criptografado (porque não espera que o usuário insira nada). Eu não quero que o usuário tenha que informar manualmente ao IDE que é hora de criptografá-lo depois de dizer sim ou não.

Você pode pensar que poderia usar pipes para rotear a entrada do usuário baseada em GUI para o terminal oculto. No entanto, como y | gpg -a --encrypt --recipient [email protected] tempFile.txt não funciona por algum motivo estranho.

    
por Shule 20.01.2016 / 09:11

2 respostas

2

Quando você executa um novo emulador de terminal, isso cria um novo terminal ( /dev/pts/NUMBER no Linux). Um programa não precisa ser iniciado por esse terminal para a saída (tente executar tty em um terminal e, em outro terminal, execute echo hello >/dev/pts/NUMBER ). Então você pode dizer ao seu script Python para ler e escrever a partir do terminal; tudo que você precisa é descobrir o caminho para o arquivo do dispositivo.

Com o xterm, é muito fácil: execute xterm -e 'tty >&3; myCommand' com o descritor de arquivo 3 conectado a um pipe, a partir do qual seu programa lê o caminho para o dispositivo terminal.

p = subprocess.Popen("xterm -e 'tty >&3; exec sleep 99999999' 3>&1",
                     shell=True, stdout=subprocess.PIPE)
tty_path = readline(p.stdout)
tty = open(tty_path, 'r+')

Seu programa em Python agora pode ler e gravar em tty . Quando terminar, mate o emulador de terminal ( os.kill(p.pid, signal.SIGTERM) ).

Com um emulador de terminal baseado em um único processo para várias janelas, como o xfce4-terminal, o que você quer fazer é consideravelmente mais difícil. A execução de xfce4-terminal quebra links entre o processo pai e o filho do emulador de terminal e não fornece um PID legal que você pode matar. Você poderia usar um pipe nomeado para se comunicar, mas é um bot mais difícil de configurar.

    
por 21.01.2016 / 00:31
1

Parece que o que você deve fazer é exatamente o oposto do que você espera alcançar. Por exemplo - por que seu terminal python não é visível de qualquer maneira ? Parece-me que esse é o terminal que você deve usar, e não se importa em pegar um novo.

Isso é como eu acho que faria:

  1. Inicie um shell de monitoramento -m em seu terminal original.

  2. Iconify a janela do terminal.

  3. Comece sua coisa no Python.

  4. Quando você chamaria seu segundo terminal, em vez disso, o Python envia um SIGSTOP para si mesmo.

  5. Mostrar o terminal.

  6. Ligue para o seu comando.

  7. Quando estiver concluído, oculte seu terminal novamente e fg seu Python.

por 21.01.2016 / 00:44

Tags