HOWTO · Python
Como reiniciar um script em Python
Aprenda três maneiras de reiniciar ou executar novamente um script Python: substituir seu processo com os.execv(), iniciar um processo filho com subprocess.call() ou repetir a lógica da aplicação em um loop.
Nesta página
Para reiniciar um script Python, escolha se você precisa de um novo processo do interpretador ou apenas repetir o trabalho do seu programa. os.execv() substitui o processo atual, subprocess.call() inicia um processo filho e aguarda sua conclusão, e um loop pode executar a lógica da sua aplicação novamente sem reiniciar o Python.
Método 1: Substituir o processo atual com os.execv()
Use os.execv() quando o interpretador atual deve ser substituído por uma nova execução do mesmo script. Passe o interpretador ativo como executável e a lista de argumentos do script como seus argumentos:
os.execv(sys.executable, [sys.executable, *sys.argv])
Importe os e sys e, em seguida, chame essa expressão quando a condição de reinicialização for atendida. sys.argv inclui o caminho do script e os argumentos fornecidos a ele, de modo que o novo interpretador os recebe novamente. Um execv() bem-sucedido não retorna ao código Python antigo; o sistema operacional executa o programa substituto no mesmo slot de processo. Libere qualquer saída que você precise preservar antes de substituir o processo. Essa operação depende da plataforma e não é demonstrada aqui como um exemplo executado.
Método 2: Iniciar um novo processo com subprocess.call()
Use subprocess.call() quando um interpretador separado deve executar o script enquanto o processo atual permanece como seu pai. A chamada é subprocess.call([sys.executable, *sys.argv]); importe subprocess e sys primeiro. Ela aguarda até que o processo filho termine e então retorna o status de saída do filho ao pai. O pai não desaparece automaticamente, portanto retorne ou saia do seu ramo de reinicialização após a chamada se ele deve parar. O filho pode herdar a mesma lógica de reinicialização, portanto certifique-se de que sua condição eventualmente permita que a execução termine. Esse comportamento de lançamento de processo não é mostrado aqui como uma saída executada.
Método 3: Repetir a lógica do programa com um loop
Se apenas o trabalho da aplicação precisa ser executado novamente, coloque esse trabalho em uma função e chame-a a partir de um loop controlado. Isso mantém o mesmo interpretador e evita a criação de uma cadeia de processos filhos. O exemplo usa uma sequência fixa de escolhas para mostrar duas execuções e uma saída limpa; substitua a sequência pela sua entrada ou pela condição da sua aplicação.
Execute este exemplo:
def run_task(number):
print(f"Run {number}")
for number, action in enumerate(("restart", "restart", "exit"), start=1):
if action == "exit":
print("Done")
break
run_task(number)
Run 1
Run 2
Done
Em um programa de linha de comando real, leia uma ação a cada passagem e chame run_task() apenas quando o usuário pedir para repeti-la. Dê ao loop uma condição de saída clara. Repetir uma função não redefine as variáveis globais dos módulos, os recursos abertos ou o estado do interpretador; feche ou reinicialize qualquer coisa que a próxima execução não deva reutilizar.
Escolha o método de reinicialização certo
Use os.execv() para substituir o processo de um script de execução única, subprocess.call() quando o pai deve aguardar uma execução separada, e um loop quando você deseja repetir um trabalho selecionado da aplicação. Essas abordagens têm ciclos de vida de processo diferentes: a substituição não deixa nenhum frame Python antigo para retomar, uma execução filha mantém o pai ativo enquanto ele aguarda, e um loop retém o estado atual do interpretador. Para um serviço web, use seu gerenciador de processos ou controles de implantação em vez de reiniciar um worker a partir de um manipulador de requisição; uma reinicialização durante a requisição pode interromper os usuários e perder o estado em memória.
Perguntas frequentes
Qual método devo escolher?
Escolha um loop para ações repetidas da aplicação, os.execv() para substituir o processo atual, ou subprocess.call() quando um processo pai precisa aguardar uma nova execução do interpretador.
Um script pode reiniciar automaticamente?
Sim. Uma condição como uma alteração de configuração pode selecionar uma reinicialização sem solicitar ao usuário. Certifique-se de que a condição possa se tornar falsa ou de alguma outra forma encerrar o ciclo de reinicialização.
Reiniciar afeta o desempenho?
Iniciar um interpretador tem custo de inicialização, e reinicializações frequentes podem repetir o trabalho de inicialização. Um loop evita essa inicialização de processo, mas mantém o estado atual do interpretador, que pode precisar de limpeza explícita.
Posso passar argumentos alterados na reinicialização?
Sim. Crie uma nova lista de argumentos para os.execv() ou subprocess.call() em vez de reutilizar sys.argv inalterado. Mantenha o executável do interpretador como o primeiro item e inclua o caminho do script antes de seus argumentos de aplicação.
Uma aplicação web deve reiniciar seu script a partir de uma requisição?
Geralmente, não. Uma reinicialização de worker durante uma requisição pode interromper o serviço e descartar o estado em memória. Use o mecanismo de reinicialização e implantação suportado pelo servidor ou gerenciador de processos.