Executando um Programa Externo sem Impedir o Funcionamento do Programa em Python
Dica publicada em Python / Miscelânea
Executando um Programa Externo sem Impedir o Funcionamento do Programa em Python
Esse é um macete bem simples para quem deseja criar um comando ou um programa em Python e deseja executar outro comando ou programa externo sem impedir o funcionamento da ferramenta que você desenvolveu. Eu precisei de algo assim e tive dificuldades de encontrar uma solução, por isso, optei por uma solução alternativa.
Em um programa que eu estou desenvolvendo criei essa função para executar um programa externo com o uso do subprocess com o apelido de sh. Esse comando será retirado de um arquivo desktop por outra função que não será apresentada nessa dica.
Parece tudo certo. Os três pontos entre colchetes, são os códigos omitidos. O que nos interessa aqui é o subprocess.call que está como sh.call. Acontece que, dessa forma o programa não vai voltar a funcionar até que o programa aberto não seja finalizado, impedindo outras operações que podem vir a ser feitas no programa. E não encontrei um módulo alternativo que me proporcionasse isso.
Como eu tenho bastante conhecimento em shell, optei por usar uma alternativa que libera o programa do emulador de terminal após a execução, que é a inserção do '&' no final do comando.
O espaço antes do '&' é necessário para não colar o caractere no comando ao concatenar. Dessa forma o comando é executado sem impedir o funcionamento do programa em python, pois assim ao executar essa instrução, o call quando abrir o shell para executar o comando o '&' já vai liberar o programa do terminal e o call vai entender que o comando já foi executado com sucesso e vai finalizar.
É um macete bem simples e bem prático. Abraços.
Em um programa que eu estou desenvolvendo criei essa função para executar um programa externo com o uso do subprocess com o apelido de sh. Esse comando será retirado de um arquivo desktop por outra função que não será apresentada nessa dica.
[ ... ]
import subprocess as sh
[ ... ]
def launch(lab, lst):
try:
lab.config(text=lst.get(ANCHOR))
text = 'Name=' + lst.get(ANCHOR) + "\n"
command = extract_command(text)
if not command:
raise Exception('Command not selected!')
print("\033[32mRunning: \033[36m" + command + "\033[m")
sh.call(command, shell=True)
except Exception as msg:
ut.info_log(msg)
[ ... ]
Parece tudo certo. Os três pontos entre colchetes, são os códigos omitidos. O que nos interessa aqui é o subprocess.call que está como sh.call. Acontece que, dessa forma o programa não vai voltar a funcionar até que o programa aberto não seja finalizado, impedindo outras operações que podem vir a ser feitas no programa. E não encontrei um módulo alternativo que me proporcionasse isso.
Como eu tenho bastante conhecimento em shell, optei por usar uma alternativa que libera o programa do emulador de terminal após a execução, que é a inserção do '&' no final do comando.
[ ... ]
import subprocess as sh
[ ... ]
def launch(lab, lst):
try:
lab.config(text=lst.get(ANCHOR))
text = 'Name=' + lst.get(ANCHOR) + "\n"
command = extract_command(text)
if not command:
raise Exception('Command not selected!')
print("\033[32mRunning: \033[36m" + command + "\033[m")
sh.call(command + ' &', shell=True)
except Exception as msg:
ut.info_log(msg)
[ ... ]
O espaço antes do '&' é necessário para não colar o caractere no comando ao concatenar. Dessa forma o comando é executado sem impedir o funcionamento do programa em python, pois assim ao executar essa instrução, o call quando abrir o shell para executar o comando o '&' já vai liberar o programa do terminal e o call vai entender que o comando já foi executado com sucesso e vai finalizar.
É um macete bem simples e bem prático. Abraços.