Start / Stop windows services with Python
При работе в Windows приходится использовать некоторые службы, которые не нужны постоянно. Особенно, когда эта машина локальная, не серверная.
Например, sphinxsearh, MySQL, PostgreSQL, очереди сообщений и проч. нужны либо в момент работы над проектом, их использующим, либо при изучении их разработчиком.
Бывают и другие примеры не нужных постоянно служб.
Обычно пользователи Виндоус могут остановить службу через Панель Управления (Администрирование - Службы) или, кто попродвинутей, через командную строку. Оба этих способа подразумевают трату времени или на поиск службы в списке, или на узнавание имени службы.
Хорошим способом будет запуск/останов/рестарт требуемых служб из Питон.
Для этого нам понадобится пакет pywin32 и простой скрипт на питоне.
Вначале автор нашел нечто готовое для задачи в PyPi репозитории. Возможно, вам подойдет:
Отсюда скачивайте последнюю версию pywin32 (там она вполне по x64 есть, не смущайтесь названием) под требуемую версию Питона, а отсюда ( ну или с Гитхаба) устанавливаем PyWinServiceManager.
Для проверки работоспособности можно сваять простенький скрипт:
Сходу у меня он дал ошибку, решение которой описано тут:
http://stackoverflow.com/questions/22490233/win32com-import-error-python-3-4
(нужно выполнить из Питона скрипт [PythonDir]\Scripts\pywin32_postinstall.py)
После исправления ошибки все запускается, однако, похоже, PyWinServiceManager писан для второго Питона. Или не для второго, но ошибок многовато и править их лень. Хотя сама библиотека задумана с размахом и может подойти для задач типа "запуск Python скрипта как windows сервис".
Мы же поищем что-то попроще.
Что-то попроще описано по ссылкам:
http://code.activestate.com/recipes/59872-manipulating-windows-services/
https://www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch07s13.html
Хинт: поскольку имеем дело с локальной машиной, в выозвах достаточно указать
machine = None или вообще переписать без использования этого параметра (по сети не тестировал, но идея выглядит интересной)
т.е. указываем
и проверяем работоспособность.
Тут все хорошо, кроме того, что служба стартует не мгновенно, точнее, не так быстро, как ее статус опрашивается. Как следствие - при запуске и перезапуске (start / restart) вы будете получать сообщение, что запуск невозможен.
Исправим это простой функции проверки статуса.
Итоговый код:
теперь, зная список служб, можно держать их в отдельном файле и стартовать/останавливать группой применительно к конкретной задаче.
P.S. конечно же, права на запуск должны быть Администратора. Т.е. или запускайте PyCharm c админ правами или классическое CMD c Run As Administrator опцией.
P.S. конечно же, права на запуск должны быть Администратора. Т.е. или запускайте PyCharm c админ правами или классическое CMD c Run As Administrator опцией.
еще сссылки по теме (не проверялись):
http://code.activestate.com/recipes/135700-win32-service-administration/
https://github.com/SublimeText/Pywin32/blob/master/lib/x32/win32/lib/win32serviceutil.py
Комментарии
Отправить комментарий