2010-04-15 6 views
1

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

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

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

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

run(reloader=True) 

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

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

Любая идея?

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

+0

Если вы все еще заинтересованы, вы можете найти полезный мой ответ здесь http://stackoverflow.com/questions/11282218/bottle-web-framework-how-to-stop/16056443#16056443 – mike

ответ

3

Есть два способа отключения перегрузочного сервер:

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

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

+0

Выполняет ли 2) работу в Windows? Спасибо за ответ. Я попробую это. – luc

+0

Если задан signal.SIGINT, это также должно работать и с окнами. Однако я его не тестировал. – user242486

1

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

Если для перезагрузки установлено значение False, то завершение работы работает нормально.

1

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

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

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

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

sys.stderr.close() 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^