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

Publicado por Mauricio Ferrari (LinuxProativo) em 11/11/2021

[ Hits: 4.094 ]

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

 


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

Trocando o LILO pelo GRUB no Slackware

Repositórios para o Slackware Current para inserir no Gslapt

Diminuindo o Tempo de Inicialização do Linux Mint

Resetando as configurações do mate-terminal

Comando "fdisk -l" não funciona como usuário comum no Deepin [Resolvido]

Leitura recomendada

DojoTools

Compilando e testando o Unladen Swallow no Linux

Instalando o IPython com extensão notebook no Linux Mint e Ubuntu

Criando aplicativos multiplataforma (Android, iOS, Windows) com Python + Kivy

TradutorOOoNote - plugin para OpenOffice.org que traduz textos para qualquer língua

  

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