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.