Seite 1 von 1

Windows Dienste in Python

Verfasst: Freitag 21. Juli 2006, 12:23
von flyingeagle
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

Re: Windows Dienste in Python

Verfasst: Freitag 21. Juli 2006, 12:26
von Leonidas
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.

Verfasst: Freitag 21. Juli 2006, 12:30
von querdenker
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

Verfasst: Freitag 21. Juli 2006, 12:33
von flyingeagle
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

Verfasst: Freitag 21. Juli 2006, 12:34
von Leonidas
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.

Verfasst: Freitag 21. Juli 2006, 13:16
von flyingeagle
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

Verfasst: Freitag 21. Juli 2006, 14:22
von flyingeagle
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.