Executando um Programa Externo sem Impedir o Funcionamento do Programa em Python

Publicado por Mauricio Ferrari em 11/11/2021

[ Hits: 3.207 ]

Blog: https://www.youtube.com/@LinuxDicasPro

 


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.

[ ... ]

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.

Outras dicas deste autor

Desativar Abertura de Diretório ao Plugar Mídias USB no Linux Mint 20

Instalando corretamente o Wine atualizado no Debian, Ubuntu, Linux Mint e derivados

Comando "sed" com parâmetro que aceita barra " / "

RecordMyDesktop no Slackware Funcionando no KDE Plasma 5

Inserindo Scripts Durante a Inicialização e o Desligamento do Sistema no KDE

Leitura recomendada

"RPG Maker" escrito em Python e Pygame

Spyder - Excelente IDE para desenvolver em Python

Nomes de arquivos e codificação

Vídeo sobre como participar do Google Summer of Code

Tropycal RPG Engine BETA

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts