Windows Dienste in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
flyingeagle
User
Beiträge: 22
Registriert: Freitag 21. Juli 2006, 12:12

Freitag 21. Juli 2006, 12:23

Hallo,

ich muss einen Windows Dienst in Python schreiben. Bei meinem Python 2.2 war ein Beispiel dabei welches ich aber leider nicht zum laufen bekommen habe.

Gibt es viellecht irgendwo ein Tutorial oder hat jemand schonmal sowas gemacht?

Ich arbeite auf einem Windows 2000 mit einem Python 2.2

Hoffe mir kann jemand helfen.

Gruss Martin
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 21. Juli 2006, 12:26

Hallo flyingeagle, willkommen im Forum,
flyingeagle hat geschrieben:Hoffe mir kann jemand helfen.
py2exe kann dir helfen - das kann EXE-Dateien generieren, die man auch als Windows-Services nutzen kann. Dokumentation findest du in dessen Wiki.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Freitag 21. Juli 2006, 12:30

Erst mal als Frage: Kannst du dein Python auf eine neuere Version bringen?

Und des weiteren : Mark Hammonds pywin-Extensions helfen, der hat auch ein Beispiel für einen Dienst dabei. Hab gerade gesehen, auch (noch) für 2.2

mfg, querdenker
flyingeagle
User
Beiträge: 22
Registriert: Freitag 21. Juli 2006, 12:12

Freitag 21. Juli 2006, 12:33

Hallo,

danke fuer die schnelle Antwort, werde ich mir gleich mal anschauen.

Was ist denn mit dem win32serviceutil das ist in meinem Bsp. verwendet worden, gibts dazu auch irgendwelche tollen Dokus, Beispiele ...

Gruss Martin
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 21. Juli 2006, 12:34

flyingeagle hat geschrieben:Was ist denn mit dem win32serviceutil das ist in meinem Bsp. verwendet worden, gibts dazu auch irgendwelche tollen Dokus, Beispiele ...
win32serviceutil ist Teil von pywin32/win32all. Dokumentation gibts wenn, dann nur das was in der CHM-Datei ist und das was du per Google in Mailinglisten findest.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
flyingeagle
User
Beiträge: 22
Registriert: Freitag 21. Juli 2006, 12:12

Freitag 21. Juli 2006, 13:16

Danke fuer eure Antworten, habe jetzt das Beispiel so weit reduziert das es sich installieren laesst und ueber die Konsole mit debug auch starten laesst.

Leider kann ich ueber die Diensteverwaltung in Windows den Dienst nicht Starten.

Hier mal mein Code, vielleicht hat ja von euch noch einer ne Idee was ich falsch mache, viel ist es naemlich nicht mehr an Code.

Code: Alles auswählen

# A Demo of services and named pipes.

# A multi-threaded service that simply echos back its input.

# * Install as a service using "pipeTestService.py install"
# * Use Control Panel to change the user name of the service
#   to a real user name (ie, NOT the SystemAccount)
# * Start the service.
# * Run the "pipeTestServiceClient.py" program as the client pipe side.

import win32serviceutil, pywintypes
from win32event import *
from win32file import *
from win32pipe import *
from win32api import *
import win32con
import thread
from ntsecuritycon import *

import win32service, winerror, traceback

def ApplyIgnoreError(fn, args):
	try:
		return apply(fn, args)
	except error: # Ignore win32api errors.
		return None

class MyService(win32serviceutil.ServiceFramework):

	_svc_name_         = "MyService"
	_svc_display_name_ = "MyService"

	def __init__(self, args):
		win32serviceutil.ServiceFramework.__init__(self, args)
		#self.hWaitStop = CreateEvent(None, 0, 0, None)
		#self.overlapped = pywintypes.OVERLAPPED()
		#self.overlapped.hEvent = CreateEvent(None,0,0,None)
		#self.thread_handles = []
		
	def SvcStop(self):
		self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
		SetEvent(self.hWaitStop)

	def SvcDoRun(self):
		import servicemanager

		servicemanager.LogMsg(
				servicemanager.EVENTLOG_INFORMATION_TYPE,
				servicemanager.PYS_SERVICE_STARTED,
				(self._svc_name_, '')
				)

if __name__=='__main__':
	win32serviceutil.HandleCommandLine(MyService)

Gruss Martin
flyingeagle
User
Beiträge: 22
Registriert: Freitag 21. Juli 2006, 12:12

Freitag 21. Juli 2006, 14:22

So, unten genanntes Problem mit dem Beenden eines Dienstes hat sich auch erledigt. Das Framework schaut ins Log ob sich ein Dienst beendet hat, zwar nicht sehr schoen aber es tut. Hier mal der Code zu meinem sehr simplen Dienst, der nichts weiter macht als alle 10 sek. etwas ins Ereignisprotokoll zu schreiben.

Code: Alles auswählen


# A Demo of services and named pipes.

# A multi-threaded service that simply echos back its input.

# * Install as a service using "pipeTestService.py install"
# * Use Control Panel to change the user name of the service
#   to a real user name (ie, NOT the SystemAccount)
# * Start the service.
# * Run the "pipeTestServiceClient.py" program as the client pipe side.

import win32serviceutil, pywintypes
from win32event import *
from win32file import *
from win32pipe import *
from win32api import *
import win32con
import thread
from ntsecuritycon import *

import win32service, winerror, traceback

def ApplyIgnoreError(fn, args):
	try:
		return apply(fn, args)
	except error: # Ignore win32api errors.
		return None

class MyService(win32serviceutil.ServiceFramework):

	_svc_name_         = "MyService"
	_svc_display_name_ = "MyService"

	def __init__(self, args):
		win32serviceutil.ServiceFramework.__init__(self, args)
		self.hWaitStop = CreateEvent(None, 0, 0, None)
		self.overlapped = pywintypes.OVERLAPPED()
		self.overlapped.hEvent = CreateEvent(None,0,0,None)
		self.thread_handles = []
		
	def SvcStop(self):
		self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
		SetEvent(self.hWaitStop)

	def SvcDoRun(self):
		import servicemanager

		while 1:
			servicemanager.LogMsg(
					servicemanager.EVENTLOG_INFORMATION_TYPE,
					servicemanager.PYS_SERVICE_STARTED,
					(self._svc_name_, '')
					)
			if WaitForSingleObject(self.hWaitStop, 10000) == WAIT_OBJECT_0:
				break
		servicemanager.LogMsg(
			servicemanager.EVENTLOG_INFORMATION_TYPE,
			servicemanager.PYS_SERVICE_STOPPED,
			(self._svc_name_, " tschuess")
			)

if __name__=='__main__':
	win32serviceutil.HandleCommandLine(MyService)


------------------------
Hallo,

habe das Problem geloest, da ich erst seit gestern mit Python arbeite ist mir nicht aufgefallen das ich eine einrueckung falsch hatte.

Der Dienst laeuft jetzt. Jetzt gehts daran ihn auch wieder beenden zu koennen.
Antworten