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

Publicado por Mauricio Ferrari em 11/11/2021

[ Hits: 3.460 ]

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

Gerenciador de Arquivos no Modo ROOT

Instalando o IPTVnator no Slackware

Instalando o Google Chrome no Slackware Current sem Slackbuilds

Usando "sscanf" para Dividir String com Delimitadores em C

Jogos e Programas para Windows portados em AppImage para Linux

Leitura recomendada

TP-1 Engine - motor para criação de jogos

Referenciando linhas anteriores em um arquivo csv usando Pandas

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

DojoTools

Hardware Project Simulator 0.1 - Simulador de montagem de computadores

  

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