python скрипт как служба windows
Использование управления службами в Python
В этом руководстве показано, как программными средствами Python выполнять общие задачи управления службами. Класс ServiceManagementService в пакете SDK Azure для Python поддерживает программный доступ к большинству функций, связанных с управлением службами, которые доступны на портале Azure. Эти функции можно использовать для создания, обновления и удаления облачных служб, развернутых служб, служб управления данными и виртуальных машин. Эта возможность может быть полезна при создании приложений, которым требуется программный доступ к управлению службами.
Что такое управление службами?
API управления службами Azure обеспечивает программный доступ к большинству функций управления службами, доступных на портале Azure. Пакет Azure SDK для Python можно использовать для управления облачными службами и учетными записями хранения.
Чтобы использовать API управления службами, необходимо создать учетную запись Azure.
Основные понятия
Пакет SDK Azure для Python служит оболочкой для API управления службами, который является интерфейсом REST API. Все операции API выполняются по TLS и проходят взаимную аутентификацию с помощью сертификатов X.509 версии 3. Доступ к службе управления можно получить из службы, работающей в Azure, или непосредственно через Интернет из любого приложения, которое может отправить HTTPS-запрос и получить HTTPS-ответ.
Установка
Подключение к управлению службами
Чтобы подключиться к конечной точке управления службами, необходимо указать идентификатор подписки Azure и допустимый сертификат управления. Идентификатор подписки можно получить на портале Azure.
Теперь можно использовать сертификаты, созданные OpenSSL при работе в ОС Windows. Требуется Python версии 2.7.4 или более поздней. Корпорация Майкрософт рекомендует использовать OpenSSL вместо PFX-сертификатов, потому что поддержка PFX-сертификатов, скорее всего, будет удалена в будущем.
Сертификаты управления в Windows/Mac/Linux (OpenSSL)
Дополнительные сведения о сертификатах Azure см. в статье Certificates overview for Azure Cloud Services (Общие сведения о сертификатах для облачных служб Azure). Полное описание параметров OpenSSL см. в документации по адресу https://www.openssl.org/docs/apps/openssl.html.
Управление сертификатами в Windows (MakeCert)
Получение списка доступных расположений
Чтобы получить список расположений, доступных для размещения служб, используйте метод list_locations.
При создании облачной службы или службы хранения необходимо указать допустимое расположение. Метод list_locations всегда возвращает текущий список доступных расположений. На момент написания этой статьи были доступны следующие расположения:
Создание облачной службы
При создании приложения и его запуске в Azure код и настройки вместе называются облачной службой Azure. (В ранних выпусках Azure она называлась размещенной службой.) Вы можете использовать метод create_hosted_service, чтобы создать размещенную службу. При этом укажите для нее имя (которое должно быть уникальным в Azure), метку (автоматически кодируется в base64), описание и расположение.
Вы можете создать список всех размещенных служб для вашей подписки при помощи метода create_hosted_service.
Чтобы получить сведения о конкретной размещенной службе, передайте имя размещенной службы в метод get_hosted_service_properties.
После того, как облачная служба была создана, разверните свой код в службе с помощью метода create_deployment.
Удаление облачной службы
Облачную службу можно удалить, передав ее в метод delete_hosted_service.
Прежде чем удалить службу, необходимо сначала удалить все ее развернутые службы. Дополнительные сведения см. в разделе Практическое руководство. Удаление развертывания.
Удаление развертывания
Создание службы хранения
Служба хранения предоставляет доступ к большим двоичным объектам, таблицам и запросам Azure. Для создания службы хранения требуется указать ее имя (длиной от 3 до 24 символов нижнего регистра, оно должно быть уникальным в пределах Azure). Также необходимо добавить описание, метку (не более 100 символов, автоматически кодируется в base64) и расположение службы. В следующем примере показано, как создать службу хранения путем указания расположения.
В описанном выше примере состояние операции create_storage_account можно извлекать путем передачи результатов, возвращенных create_storage_account, в метод get_operation_status.
Можно вывести список ваших учетных записей хранения и их свойств с помощью метода list_storage_accounts.
Удаление службы хранения
Чтобы удалить службу хранения, передайте ее в метод delete_storage_account. Удаление службы хранилища приводит к удалению всех данных, хранящихся в службе (больших двоичных объектов, таблиц и очередей).
Перечисление доступных операционных систем
Чтобы получить список операционных систем, доступных для служб размещения, используйте метод list_operating_systems.
Кроме того, можно использовать метод list_operating_system_families, который группирует операционные системы по семействам.
Создание образа операционной системы
Чтобы добавить образ операционной системы в репозиторий образов, используйте метод add_os_image.
Чтобы получить список доступных образов операционных систем, используйте метод list_os_images. Сюда входят все образы платформ и пользовательские образы.
Удаление образа операционной системы
Для удаления пользовательского образа используйте метод delete_os_image.
Создание виртуальной машины
Чтобы создать виртуальную машину, необходимо сначала создать облачную службу. После этого создайте развертывание виртуальной машины, с помощью метода create_virtual_machine_deployment.
Удаление виртуальной машины
Чтобы удалить виртуальную машину, необходимо сначала удалить развертывание с помощью метода delete_deployment.
Затем можно удалить облачную службу с помощью метода delete_hosted_service.
Создание виртуальной машины из записанного образа виртуальной машины
Чтобы записать образ виртуальной машины, сначала вызовите метод capture_vm_image.
Чтобы убедиться, что образ записан успешно, используйте API list_vm_images. Убедитесь, что выбранный образ отображается в результатах.
Наконец, чтобы создать виртуальную машину с помощью записанного образа, используйте метод create_virtual_machine_deployment как раньше, но на этот раз передайте vm_image_name.
Дополнительные сведения о записи образа виртуальной машины Linux в классической модели развертывания см. в статье Запись классической виртуальной машины Linux в виде образа.
Дополнительные сведения о записи образа виртуальной машины Windows в классической модели развертывания см. в статье Запись образа виртуальной машины Azure Windows, созданной с использованием классической модели развертывания.
Дальнейшие действия
Теперь, когда вы ознакомились с основами службы управления, можно приступить к полной справочной документации по API для пакета SDK Azure Python и легко выполнять сложные задачи, управляя своим приложением Python.
Дополнительную информацию можно найти в Центре разработчика Python.
Как запустить скрипт Python в качестве службы в Windows?
я набрасываю архитектуру для набора программ, которые совместно используют различные взаимосвязанные объекты, хранящиеся в базе данных. Я хочу, чтобы одна из программ действовала как служба, которая предоставляет интерфейс более высокого уровня для операций с этими объектами, а другие программы для доступа к объектам через эту службу.
в настоящее время я нацелен на Python и Django framework в качестве технологий для реализации этой службы. Я уверен, что я понимаю, как демонизировать Python программы в Linux. Однако это необязательный элемент спецификации, который система должна поддерживать Windows. У меня мало опыта программирования Windows и никакого опыта работы со службами Windows.
можно ли запускать программы на Python как служба Windows (у меня. е. запустить его автоматически без входа пользователя в систему)? мне не обязательно будет реализовывать эту часть, но мне нужна грубая идея, как это будет сделано, чтобы решить, следует ли проектировать вдоль этих русло.
Edit: Спасибо за все ответы до сих пор, они довольно полные. Я хотел бы знать еще одну вещь: как Windows знает о моей службе? Могу ли я управлять им с помощью собственных утилит Windows? что эквивалентно помещению скрипта start/stop в /etc/init.Ди?
8 ответов
Да, вы можете. Я делаю это с помощью библиотек pythoncom, которые входят в комплект ActivePython или может быть установлен с pywin32 (Python для расширений Windows).
это основной скелет для простой службы:
ваш код будет идти в main() метод-обычно с каким-то бесконечным циклом, который может быть прерван проверкой флага, который вы устанавливаете в SvcStop метод
хотя я поддержал выбранный ответ пару недель назад, тем временем я боролся намного больше с этой темой. Похоже, что специальная установка Python и использование специальных модулей для запуска скрипта в качестве службы-это просто неправильный способ. Как насчет переносимости и тому подобного?
я наткнулся на замечательный Non-сосание Service Manager, что сделало его очень простым и здравомыслящим, чтобы иметь дело со службами Windows. Я подумал, что, поскольку я могу передать варианты установленная служба, я мог бы также выбрать свой исполняемый файл Python и передать свой скрипт в качестве опции.
Я еще не пробовал это решение, но я сделаю это прямо сейчас и обновлю этот пост по ходу процесса. Мне также интересно использовать virtualenvs в Windows, поэтому я могу рано или поздно придумать учебник и ссылку на него здесь.
существует несколько альтернатив для установки в качестве службы практически любого исполняемого файла Windows.
метод 1: Используйте instsrv и srvany из rktools.exe
для Windows Home Server или Windows Server 2003 (также работает с WinXP),Средства Набора Ресурсов Windows Server 2003 поставляется с утилитами, которые могут быть использованы в тандеме для этого, называется instsrv.exe и srvany.exe. См. эту статью Microsoft KB KB137890 для получения подробной информации о том, как использовать эти utils.
для Windows Home Server Есть отличная удобная оболочка для этих утилит с именем aptly»Любой Установщик Службы».
Метод 2: Используйте ServiceInstaller для Windows NT
есть еще одна альтернатива с помощью ServiceInstaller для Windows NT (скачать-может здесь) С доступны инструкции python. Вопреки имя, он работает как с Windows 2000, так и с Windows XP. Ниже приведены некоторые инструкции по установке скрипта python в качестве службы.
установка скрипта Python
запустите ServiceInstaller для создания нового услуга. (В данном примере это предполагается, что python установлен на c:\python25)
после установки, откройте контроль Апплет служб панели, выберите и запустить PythonTest услуга.
после моего первоначального ответа я заметил, что на SO уже размещены тесно связанные вопросы и ответы. См. также:
Как запустить сценарий Python как службу в Windows?
В настоящее время я нацелен на создание Python и Django как технологий для реализации этого сервиса. Я почти уверен, что я понимаю, как демонизировать программу Python в Linux. Тем не менее, это необязательный элемент спецификации, который система должна поддерживать Windows. У меня мало опыта программирования Windows, и у меня нет опыта работы с службами Windows.
Можно ли запускать программы Python в качестве службы Windows (т.е. запускать ее автоматически без входа пользователя)? Я не обязательно буду реализовывать эту часть, но мне нужно понять, как это будет сделано для того, чтобы решить, следует ли разрабатывать эти строки.
Изменить: Спасибо за все ответы до сих пор, они довольно полные. Я хотел бы узнать еще одно: Как Windows знает о моем сервисе? Могу ли я управлять им с помощью родных утилит Windows? Что эквивалентно помещению start/stop script в/etc/init.d?
ОТВЕТЫ
Ответ 1
Да, вы можете. Я использую библиотеки pythoncom, входящие в состав ActivePython или могут быть установлены с pywin32 (расширения для Python для Windows).
Это базовый скелет для простой службы:
Ответ 2
Я наткнулся на замечательный Non-sucking Service Manager, который сделал его очень простым и разумным для работы с Windows Services. Я понял, что, поскольку я мог передавать параметры установленному сервису, я мог бы просто выбрать исполняемый файл Python и передать мой script в качестве опции.
Я еще не пробовал это решение, но я сделаю это прямо сейчас и обновил этот пост в процессе. Я также заинтересован в использовании virtualenvs в Windows, поэтому я мог бы придумать учебник рано или поздно и ссылку на него здесь.
Ответ 3
Существует несколько альтернатив для установки в качестве службы практически любого исполняемого файла Windows.
Способ 1: Использовать instrrv и srvany из rktools.exe
Для Windows Home Server или Windows Server 2003 (также работает с WinXP), Windows Server 2003 Resource Kit Tools поставляется с утилит, которые могут для этого используется тандема, называемая instsrv.exe и srvany.exe. Подробнее о том, как использовать эти утилиты, см. В статье Microsoft KB KB137890.
Для Windows Home Server существует большая удобная оболочка для этих утилит с меткой «» Любой установщик услуг».
Способ 2. Использовать ServiceInstaller для Windows NT
Существует другая альтернатива, использующая ServiceInstaller для Windows NT ( скачать можно здесь) с доступные инструкции python. В отличие от имени, он работает как с Windows 2000, так и с Windows XP. Ниже приведены некоторые инструкции по установке python script в качестве службы.
Установка Python script
Запустите ServiceInstaller, чтобы создать новый оказание услуг. (В этом примере это предположил, что python установлен на C:\Python25)
После установки откройте Control Апплет Panel Services, выберите и запустите службу PythonTest.
После моего первоначального ответа я заметил, что были тесно связанные Q & A, уже опубликованные на SO. См. Также:
Ответ 4
Рекомендации:
Ответ 5
c:> nssm.exe установить WinService
Каталог автозагрузки: C:\Python27
Ответ 6
Пошаговое объяснение, как заставить его работать:
1- Сначала создайте файл python в соответствии с основным скелетом, упомянутым выше. И сохраните его на пути, например: «c:\PythonFiles\AppServerSvc.py»
Запустите командную строку как администратор и введите:
sc создать TestService binpath = «C:\Python36\Python.exe c:\PythonFiles\AppServerSvc.py» DisplayName = «TestService» start = auto
первым аргументом binpath является путь файла python.exe
Не пропустите, что вы должны поместить одно место после каждого знака
Ответ 7
Я начал хостинг как сервис с pywin32.
Все было хорошо, но я столкнулся с проблемой, что служба не может запуститься в течение 30 секунд (время ожидания по умолчанию для Windows) при запуске системы. Это было очень важно для меня, потому что запуск Windows происходил одновременно на нескольких виртуальных машинах, размещенных на одной физической машине, и нагрузка ввода-вывода была огромной. Сообщения об ошибках были:
Error 1053: The service did not respond to the start or control request in a timely fashion.
Error 7009: Timeout (30000 milliseconds) waiting for the service to connect.
Я много боролся с pywin, но в итоге использовал NSSM, как было предложено в этом ответе. Было очень легко перейти на него.
Ответ 8
nssm в Python 3+
NSSM: как уже было сказано
На консоли NSSM:
путь: путь\к\вашему\program.exe
Аргументы: пусто
Ответ 9
Принятый ответ с использованием win32serviceutil работает, но сложен и усложняет отладку и изменения. Намного проще использовать NSSM (диспетчер неосасывающих услуг). Вы пишете и удобно отлаживаете обычную программу на Python, и когда она наконец работает, вы используете NSSM, чтобы установить ее как службу менее чем за минуту:
В командной строке с nssm.exe install NameOfYourService (admin) вы запускаете nssm.exe install NameOfYourService и вводите следующие параметры:
Кстати, если ваша программа печатает полезные сообщения, которые вы хотите сохранить в файле журнала, NSSM также может обработать это и многое другое для вас.
Ответ 10
Вы можете использовать powershell или cmd чтобы протестировать свой сервис и найти более подробную информацию об ошибках.
Если вы получаете какую-то ошибку, как я, вы можете проверить мой ответ в другом вопросе, я исправил его и опубликовал свой код здесь.
Ответ 11
Пример script для запуска в качестве службы взято из pythonhosted.org:
Создать и запустить сервис
Служба остановки и удаления
How do you run a Python script as a service in Windows?
I am sketching the architecture for a set of programs that share various interrelated objects stored in a database. I want one of the programs to act as a service which provides a higher level interface for operations on these objects, and the other programs to access the objects through that service.
I am currently aiming for Python and the Django framework as the technologies to implement that service with. I’m pretty sure I figure how to daemonize the Python program in Linux. However, it is an optional spec item that the system should support Windows. I have little experience with Windows programming and no experience at all with Windows services.
Is it possible to run a Python programs as a Windows service (i. e. run it automatically without user login)? I won’t necessarily have to implement this part, but I need a rough idea how it would be done in order to decide whether to design along these lines.
Edit: Thanks for all the answers so far, they are quite comprehensive. I would like to know one more thing: How is Windows aware of my service? Can I manage it with the native Windows utilities? What is the equivalent of putting a start/stop script in /etc/init.d?
13 Answers 13
Yes you can. I do it using the pythoncom libraries that come included with ActivePython or can be installed with pywin32 (Python for Windows extensions).
This is a basic skeleton for a simple service:
Your code would go in the main() method—usually with some kind of infinite loop that might be interrupted by checking a flag, which you set in the SvcStop method
GUI approach
Startup directory: C:\Python27
Scripting approach (no GUI)
This is handy if your service should be part of an automated, non-interactive procedure, that may be beyond your control, such as a batch or installer script. It is assumed that the commands are executed with administrative privileges.
1. Install the service
You must specify a name for the service, the path to the proper Python executable, and the path to the script:
Alternatively you may want your Python app to be started as a Python module. One easy approach is to tell nssm that it needs to change to the proper starting directory, as you would do yourself when launching from a command shell:
This approach works well with virtual environments and self-contained (embedded) Python installs. Just make sure to have properly resolved any path issues in those environments with the usual methods. nssm has a way to set environment variables (e.g. PYTHONPATH) if needed, and can also launch batch scripts.
2. To start the service
3. To stop the service
4. To remove the service, specify the confirm parameter to skip the interactive confirmation.
Although I upvoted the chosen answer a couple of weeks back, in the meantime I struggled a lot more with this topic. It feels like having a special Python installation and using special modules to run a script as a service is simply the wrong way. What about portability and such?
I stumbled across the wonderful Non-sucking Service Manager, which made it really simple and sane to deal with Windows Services. I figured since I could pass options to an installed service, I could just as well select my Python executable and pass my script as an option.
I have not yet tried this solution, but I will do so right now and update this post along the process. I am also interested in using virtualenvs on Windows, so I might come up with a tutorial sooner or later and link to it here.
The simplest way to achieve this is to use native command sc.exe:
References:
There are a couple alternatives for installing as a service virtually any Windows executable.
Method 1: Use instsrv and srvany from rktools.exe
For Windows Home Server or Windows Server 2003 (works with WinXP too), the Windows Server 2003 Resource Kit Tools comes with utilities that can be used in tandem for this, called instsrv.exe and srvany.exe. See this Microsoft KB article KB137890 for details on how to use these utils.
For Windows Home Server, there is a great user friendly wrapper for these utilities named aptly «Any Service Installer».
Method 2: Use ServiceInstaller for Windows NT
There is another alternative using ServiceInstaller for Windows NT (download-able here) with python instructions available. Contrary to the name, it works with both Windows 2000 and Windows XP as well. Here are some instructions for how to install a python script as a service.
Installing a Python script
Run ServiceInstaller to create a new service. (In this example, it is assumed that python is installed at c:\python25)
After installing, open the Control Panel’s Services applet, select and start the PythonTest service.
After my initial answer, I noticed there were closely related Q&A already posted on SO. See also:
Step by step explanation how to make it work :
1- First create a python file according to the basic skeleton mentioned above. And save it to a path for example : «c:\PythonFiles\AppServerSvc.py»
Run command prompt as administrator and type as:
sc create TestService binpath= «C:\Python36\Python.exe c:\PythonFiles\AppServerSvc.py» DisplayName= «TestService» start= auto
the first argument of binpath is the path of python.exe
second argument of binpath is the path of your python file that we created already
Don’t miss that you should put one space after every «=» sign.
Then if everything is ok, you should see
Now your python service is installed as windows service now. You can see it in Service Manager and registry under :
3- Ok now. You can start your service on service manager.
You can execute every python file that provides this service skeleton.
Example script to run as a service taken from pythonhosted.org:
Create and start service
Stop and delete service
nssm in python 3+
nssm: as said before
On NSSM´s console:
path: path\to\your\program.exe
Startup directory: path\to\your\ #same as the path but without your program.exe
Arguments: empty
I started hosting as a service with pywin32.
Everything was well but I met the problem that service was not able to start within 30 seconds (default timeout for Windows) on system startup. It was critical for me because Windows startup took place simultaneous on several virtual machines hosted on one physical machine, and IO load was huge. Error messages were:
Error 1053: The service did not respond to the start or control request in a timely fashion.
Error 7009: Timeout (30000 milliseconds) waiting for the service to connect.
I fought a lot with pywin, but ended up with using NSSM as it was proposed in this answer. It was very easy to migrate to it.
A complete pywin32 example using loop or subthread
After working on this on and off for a few days, here is the answer I would have wished to find, using pywin32 to keep it nice and self contained.
This is complete working code for one loop-based and one thread-based solution. It may work on both python 2 and 3, although I’ve only tested the latest version on 2.7 and Win7. The loop should be good for polling code, and the tread should work with more server-like code. It seems to work nicely with the waitress wsgi server that does not have a standard way to shut down gracefully.
I would also like to note that there seems to be loads of examples out there, like this that are almost useful, but in reality misleading, because they have cut and pasted other examples blindly. I could be wrong. but why create an event if you never wait for it?
That said I still feel I’m on somewhat shaky ground here, especially with regards to how clean the exit from the thread version is, but at least I believe there are nothing misleading here.
To run simply copy the code to a file and follow the instructions.
update:
Use a simple flag to terminate thread. The important bit is that «thread done» prints.
For a more elaborate example exiting from an uncooperative server thread see my post about the waitress wsgi server.
Now there’s a bit of editing and you don’t want all your services called ‘pyGlue’. So there’s a script (build.sh) to plug in the bits and create a customized ‘pyGlue’ and create an ‘.exe’. It is this ‘.exe’ which gets installed as a Windows Service. Once installed you can set it to run automatically.