Как остановить веб-сервер Bottle при запуске из подпроцесса - PullRequest
2 голосов
/ 15 апреля 2010

Я хотел бы встроить отличный веб-фреймворк Bottle в небольшое приложение (первая цель - ОС Windows). Это приложение запускает бутылочный веб-сервер благодаря модулю подпроцесса.

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

Приложение для бутылок довольно простое

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

run(reloader=True)

Запускает веб-сервер по умолчанию в консоли Windows.

Все выглядит нормально, за исключением того, что я должен нажать Ctrl-C, чтобы закрыть веб-сервер бутылки. Я хотел бы, чтобы мастер-приложение завершало работу веб-сервера при его завершении. Я не могу найти способ сделать это (к сожалению, p.terminate () в этом случае не работает)

Есть идеи?

Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 15 апреля 2010

Существует два способа выключить сервер перезагрузки:

1) Вы завершаете p (используя os.kill(p.pid) или p.terminate()), а затем изменяете время изменения файла websrv.py (os.utime('websrv.py')), чтобы запустить автоматическое отключение дочернего процесса.

2) Вы завершаете p нажатием os.kill(p.pid, signal.SIGINT), что идентично завершению Ctrl-C.

1 голос
/ 30 июля 2010

Начиная с 0.8.1, сервер перезагрузки достаточно умен, чтобы очистить потерянные процессы. Теперь у вас есть несколько способов завершить работу сервера:

  • Нажмите Ctrl-C или отправьте SIGINT в родительский процесс. (Рекомендуется)
  • убить родительский процесс. Ребенок умрет изящно через 2 секунды.
  • Убить дочерний процесс или sys.exit () любым кодом состояния, кроме 3. Родитель немедленно умрет.
1 голос
/ 15 апреля 2010

Кажется, что процесс завершения не работает, если Bottle находится в режиме перезагрузки. В этом случае он сам запускает подпроцесс.

Если для reload задано значение False, терминат работает нормально.

0 голосов
/ 15 июля 2012

У меня были проблемы с закрытием бутылочного сервера из запроса, поскольку бутылка, кажется, выполняет запросы в подпроцессах.

В конце концов я обнаружил, что решение было сделать:

sys.stderr.close()

внутри запроса (который был передан серверу бутылок и обработан).

Возможно, попробуйте сделать это в своем процессе и посмотреть, получит ли бутылка сообщение.

...