Pergunta

Eu gostaria de incorporar o grande Garrafa Framework da Web em um pequeno aplicativo (o 1º destino é o sistema operacional Windows). Este aplicativo inicia o servidor da web em garrafa graças ao módulo de subprocesso.

import subprocess
p = subprocess.Popen('python websrv.py')

O aplicativo de garrafa é bastante simples

@route("/")
def index():
    return template('index')

run(reloader=True)

Ele inicia o servidor da web padrão em um console do Windows.

Tudo parece bom, exceto o fato de que eu devo pressionar Ctrl-C para fechar o servidor da web em garrafa. Gostaria que o aplicativo principal encerre o servidor da web quando ele desligar. Não consigo encontrar uma maneira de fazer isso (p.terminate () não funciona neste caso, infelizmente)

Qualquer ideia?

desde já, obrigado

Foi útil?

Solução

Existem duas maneiras de desligar um servidor de recarga:

1) Você termina P (usando os.kill(p.pid) ou p.terminate() ) e, em seguida, altere o tempo de modificação de 'websrv.py' (os.utime('websrv.py')) para acionar um desligamento automático do processo filho.

2) Você termina P com os.kill(p.pid, signal.SIGINT) que é idêntico a um Ctrl-C desligar.

Outras dicas

Parece que o processo de encerramento não funciona se a garrafa estiver no modo recarregar. Nesse caso, ele começa um subprocesso.

Se a recarga estiver definida como falsa, o término parece funcionar bem.

Começando com 0,8.1, o servidor de recarga é inteligente o suficiente para limpar os processos órfãos. Agora você tem várias maneiras de encerrar o servidor:

  • Acertar Ctrl-C ou envie SIGINT para o processo pai. (recomendado)
  • Mate o processo pai. A criança morrerá graciosamente dentro de 2 segundos.
  • Mate o processo filho ou sys.exit () com qualquer código de status diferente de 3. O pai morrerá imediatamente.

Eu tive problemas para fechar um servidor de garrafa de uma solicitação, pois a garrafa parece executar solicitações em subprocessos.

Eu finalmente descobri que a solução era fazer:

sys.stderr.close()

Dentro da solicitação (que foi passada para o servidor de garrafa e a fez).

Talvez tente fazer isso em seu processo e veja se a garrafa recebe a mensagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top