Szkicuję architekturę dla zestawu programów, które współużytkują różne powiązane ze sobą obiekty przechowywane w bazie danych. Chcę, aby jeden z programów działał jako usługa, która zapewnia interfejs wyższego poziomu dla operacji na tych obiektach, a pozostałe programy miały dostęp do obiektów za pośrednictwem tej usługi.
Obecnie dążę do stworzenia Pythona i frameworka Django jako technologii do wdrożenia tej usługi. Jestem prawie pewien, że wymyślę sposób demonizacji programu Python w systemie Linux. Jest to jednak opcjonalny element specyfikacji, który system powinien obsługiwać system Windows. Mam niewielkie doświadczenie w programowaniu systemu Windows i wcale nie mam doświadczenia z usługami systemu Windows.
Czy można uruchomić programy w języku Python jako usługę systemu Windows (tj. Uruchomić je automatycznie bez logowania użytkownika)? Niekoniecznie będę musiał zaimplementować tę część, ale potrzebuję wstępnego pomysłu, jak to zrobić, aby zdecydować, czy projektować według tych zasad.
Edycja: Dzięki za wszystkie dotychczasowe odpowiedzi, są one dość wyczerpujące. Chciałbym wiedzieć jeszcze jedno: w jaki sposób system Windows jest świadomy mojej usługi? Czy mogę zarządzać za pomocą rodzimych narzędzi systemu Windows? Co jest równoważne z umieszczeniem skryptu start / stop w /etc/init.d?
źródło
Odpowiedzi:
Tak, możesz. Robię to za pomocą bibliotek pythoncom, które są dołączone do ActivePython lub mogą być instalowane z pywin32 (rozszerzenia Python dla Windows).
To jest podstawowy szkielet prostej usługi:
Twój kod przejdzie do
main()
metody - zwykle z jakąś nieskończoną pętlą, która może zostać przerwana przez sprawdzenie flagi ustawionej wSvcStop
metodzieźródło
socket.setdefaulttimeout(60)
jest? Czy jest potrzebny do usługi, czy został przypadkowo skopiowany z istniejącej usługi? :)Chociaż kilka tygodni temu głosowałem za wybraną odpowiedzią, tymczasem miałem więcej problemów z tym tematem. To tak, jakby mieć specjalną instalację Pythona i używanie specjalnych modułów do uruchamiania skryptu, ponieważ usługa jest po prostu niewłaściwym sposobem. Co z przenośnością i tym podobne?
Natknąłem się na wspaniałego Menedżera usług bez ssania , który sprawił, że obsługa Usług Windows była naprawdę prosta i rozsądna. Pomyślałem, że ponieważ mogę przekazać opcje do zainstalowanej usługi, równie dobrze mogę wybrać plik wykonywalny Python i przekazać skrypt jako opcję.
Jeszcze nie wypróbowałem tego rozwiązania, ale zrobię to teraz i zaktualizuję ten post w trakcie tego procesu. Interesuje mnie również korzystanie z virtualenvs w systemie Windows, więc prędzej czy później mogę wymyślić samouczek i link do niego tutaj.
źródło
new-service
w PowerShell powinno to być w stanie to zrobić, ale uruchomienie (i monitorowanie) skryptu jako usługi najwyraźniej wymaga znacznie więcej szczegółów, o które nssm bardzo ładnie się dba.Najprostszym sposobem jest użycie: NSSM - Menedżer usług niessących:
1 - wykonaj pobieranie na https://nssm.cc/download
2 - zainstaluj program python jako usługę: monit Win jako administrator
c:> nssm.exe zainstaluj WinService
3 - W konsoli NSSM:
ścieżka: C: \ Python27 \ Python27.exe
Katalog startowy: C: \ Python27
Argumenty: c: \ WinService.py
4 - sprawdź utworzone usługi w services.msc
źródło
Najprostszym sposobem na osiągnięcie tego jest użycie natywnego polecenia sc.exe:
Bibliografia:
źródło
Istnieje kilka alternatyw dla instalacji jako usługi praktycznie dowolnego pliku wykonywalnego Windows.
Metoda 1: Użyj instsrv i srvany z rktools.exe
W przypadku systemu Windows Home Server lub Windows Server 2003 (współpracuje również z WinXP), Zestaw narzędzi Windows Server 2003 Resource Kit Tools zawiera narzędzia, które mogą być używane w tym celu w tandemie, o nazwie instsrv.exe i srvany.exe . Zobacz artykuł KB137890 KB firmy Microsoft, aby uzyskać szczegółowe informacje na temat korzystania z tych narzędzi.
W przypadku systemu Windows Home Server istnieje świetne, przyjazne dla użytkownika opakowanie dla tych narzędzi o nazwie „ Any Service Installer ”.
Metoda 2: Użyj ServiceInstaller dla Windows NT
Istnieje inna alternatywa przy użyciu ServiceInstaller dla Windows NT (do pobrania tutaj ) z dostępnymi instrukcjami python . W przeciwieństwie do nazwy, działa zarówno z Windows 2000, jak i Windows XP. Oto kilka instrukcji, jak zainstalować skrypt Pythona jako usługę.
Po mojej pierwszej odpowiedzi zauważyłem, że na SO zostały już ściśle powiązane pytania i odpowiedzi. Zobacz też:
Czy mogę uruchomić skrypt Pythona jako usługę (w systemie Windows)? W jaki sposób?
Jak uświadomić systemowi Windows usługę napisaną w języku Python?
źródło
NT
że niekoniecznie byłoby „sprzeczne” z nazwą, przynajmniej nie w mowie programistów. Odnosi się tylko do „ architektury NT ”, a nie do „ marki NT ”. To powiedziawszy, zgodnie z dyskusją na wikipedii jest to do debaty, ponieważ „to nie jest oficjalny termin Microsoft”, ale mimo to istnieje tradycja z tym tokiem myślenia.Wyjaśnienie krok po kroku, jak to działa:
1- Najpierw utwórz plik python zgodnie z podstawowym szkieletem wspomnianym powyżej. I zapisz go na ścieżce, na przykład: „c: \ PythonFiles \ AppServerSvc.py”
2 - Na tym etapie powinniśmy zarejestrować naszą usługę.
Uruchom wiersz polecenia jako administrator i wpisz:
pierwszym argumentem binpath jest ścieżka do python.exe
drugim argumentem binpath jest ścieżka do pliku Pythona, który już utworzyliśmy
Nie przegap, że po każdym znaku „ = ” należy umieścić jedną spację .
Jeśli wszystko jest w porządku, powinieneś zobaczyć
Teraz Twoja usługa python jest teraz instalowana jako usługa Windows. Możesz to zobaczyć w Service Managerze i rejestrze pod:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService
3- OK. Możesz uruchomić usługę w menedżerze usług.
Możesz wykonać każdy plik Pythona, który udostępnia szkielet usługi.
źródło
SetEvent(self.hWaitStop)
iWaitForSingleObject
. Prawdopodobnie w oparciu o bezmyślne kopiowanie wybranej odpowiedzi tutaj. Jest to dobry sposób na zrobienie tego, który działa czysto dla obu argumentów „debug” i argumentów „stop”. (Część dotycząca używania SC wydaje się zbędna, kiedyHandleCommandLine
wykonuje zadanie i może uruchomić debugowanie.)pysc: Service Control Manager w Pythonie
Przykładowy skrypt do uruchomienia jako usługa pobrana z pythonhosted.org :
źródło
Zacząłem hosting jako usługa z pywin32 .
Wszystko było dobrze, ale napotkałem problem polegający na tym, że usługa nie była w stanie uruchomić się w ciągu 30 sekund (domyślny limit czasu dla systemu Windows) po uruchomieniu systemu. Było to dla mnie bardzo ważne, ponieważ uruchomienie systemu Windows odbyło się jednocześnie na kilku maszynach wirtualnych hostowanych na jednej maszynie fizycznej, a obciążenie IO było ogromne. Komunikaty o błędach to:
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 <ServiceName> service to connect.
Dużo walczyłem z pywin, ale ostatecznie wykorzystałem NSSM, jak zaproponowano w tej odpowiedzi . Migracja do niego była bardzo łatwa.
źródło
nssm w python 3+
(Mój plik .py przekonwertowałem na .exe za pomocą programu pyinstaller )
nssm: jak powiedziano wcześniej
Na konsoli NSSM:
ścieżka: ścieżka \ do \ twojego \ programu.exe
Katalog startowy: ścieżka \ do \ twoja \ # nazwa jako ścieżka, ale bez programu.exe
Argumenty: puste
Jeśli nie chcesz konwertować projektu do .exe
python {{your python.py file name}}
źródło
Kompletny przykład pywin32 wykorzystujący pętlę lub wątek
Po kilku dniach pracy nad tym i wyłączaniu, oto odpowiedź, którą chciałbym znaleźć, używając pywin32, aby zachować ładność i spokój.
Jest to kompletny działający kod dla jednego rozwiązania opartego na pętli i jednego wątku. Może działać zarówno na Pythonie 2, jak i 3, chociaż najnowszą wersję testowałem tylko na wersjach 2.7 i Win7. Pętla powinna być odpowiednia do odpytywania kodu, a bieżnik powinien współpracować z kodem podobnym do serwerowego. Wygląda na to, że dobrze współpracuje z serwerem wsgi kelnerki , która nie ma standardowego sposobu na płynne zamknięcie.
Chciałbym również zauważyć, że wydaje się, że istnieje mnóstwo przykładów, takich jak te, które są prawie przydatne, ale w rzeczywistości wprowadzają w błąd, ponieważ ślepo wycięły i wkleiły inne przykłady. Mogę się mylić. ale po co tworzyć wydarzenie, jeśli nigdy na nie nie czekasz?
To powiedziawszy, nadal czuję, że jestem tutaj na nieco chwiejnym gruncie, szczególnie jeśli chodzi o to, jak czyste jest wyjście z wersji wątku, ale przynajmniej uważam, że nie ma tu niczego mylącego .
Aby uruchomić, po prostu skopiuj kod do pliku i postępuj zgodnie z instrukcjami.
aktualizacja:
Użyj prostej flagi, aby zakończyć wątek. Ważne jest to, że drukuje się „wątek zrobiony”.
Bardziej rozbudowany przykład wychodzenia z niechętnego wątku serwera znajduje się w moim poście o serwerze wsgi kelnerki .
źródło
Akceptowana odpowiedź przy użyciu
win32serviceutil
działa, ale jest skomplikowana i utrudnia debugowanie i zmiany. O wiele łatwiej jest korzystać z NSSM ( Menedżera usług niessących ) . Piszemy i wygodnie debugujemy normalny program w języku Python, a gdy w końcu zadziała, za pomocą NSSM zainstalujesz go jako usługę w mniej niż minutę:Z wiersza polecenia z podwyższonym poziomem uprawnień (administratora) uruchamiasz
nssm.exe install NameOfYourService
i wypełniasz następujące opcje:C:\Python27\Python.exe
)c:\path\to\program.py
)Nawiasem mówiąc, jeśli twój program drukuje przydatne wiadomości, które chcesz przechowywać w pliku dziennika, NSSM może również obsłużyć to i wiele więcej.
źródło
Dla każdego, kto chce stworzyć usługę w VENV lub Pycharm !!!!!!!
Po przeczytaniu wszystkich anwsers i utwórz kilka skryptów, jeśli możesz uruchomić
python service.py install
ipython service.py debug
, alepython service.py start
nie ma odpowiedzi.Być może jest to spowodowane problemem Venv, ponieważ usługa Windows uruchamia usługę przez exec
PROJECT\venv\Lib\site-packages\win32\pythonservice.exe
.Możesz użyć
powershell
lubcmd
przetestować swoją usługę, aby znaleźć więcej szczegółów błędu.Jeśli pojawi się jakiś błąd, taki jak ja, możesz sprawdzić moją odpowiedź w innym pytaniu, naprawiłem go i opublikowałem tutaj swój kod .
źródło
https://www.chrisumbel.com/article/windows_services_in_python
Kontynuuj PySvc.py
zmiana folderu dll
Wiem, że to stare, ale utknąłem w tym na zawsze. Dla mnie ten konkretny problem został rozwiązany przez skopiowanie tego pliku - pywintypes36.dll
Od -> Python36 \ Lib \ site-packages \ pywin32_system32
Do -> Python36 \ Lib \ site-packages \ win32
cd C:\Users\user\AppData\Local\Programs\Python\Python38-32
NET START PySvc
NET STOP PySvc
źródło