Seite 1 von 1

Queue über C-Modul füllen

Verfasst: Samstag 26. April 2008, 09:41
von droptix
Möchte ein C-Modul für Python schreiben, um Windows-Events zu überwachen (nicht mit WMI). Das C-Modul soll wie Pythons `Queue.Queue()` funktionieren und jedes aufgeschnappte Event in die Queue speichern. Aus Python heraus möchte ich dann regulär über `get()` jeden Eintrag abarbeiten und auswerten. Ach ja: von den Methoden `join()` und `task_done()` (seit Python 2.5) würde ich auch gern profitieren.

Wichtig ist eben, dass die Event-Erkennung über C läuft, weil z.B. WMI hier zu lahm ist und einige Sachen übersieht (wegen Polling), v.a. wenn der Rechner gerade ausgelastet ist.

Meinem C-Modul möchte ich noch folgende Methoden auf den weg geben:
  • - load(): lädt benötigte Bibliotheken
    - unload(): entlädt diese wieder
    - start(): aktiviert die Überwachung, d.h. erkannte Events werden in die Queue eingetragen
    - stop(): deaktiviert die Überwachung, d.h. erkannte Events werden ignoriert
    - run(): die Überwachung selbst
Nun reichen meine C-Kenntnisse nicht aus, und dazu kommt noch dass ich bislang nur ein wenig mit Python und C-Modulen herum experimentiert habe (nur simple Beispiele).

Daher wollte ich nachfragen, ob mir jemand unter die Arme greifen könnte und für das folgende Beispiel ein Code-Gerüst in C vorschlagen würde.

In Python würde ich mir das so vorstellen:

Code: Alles auswählen

import Queue

class MyCModule(Queue.Queue):
	"""a Python `Queue.Queue()` like object in C"""
	__loaded = False
	"""status if loaded or not"""
	__active = False
	"""status if active or not"""
	
	def __init__(self):
		self.load()
	
	def load(self):
		"""loads some libraries"""
		try:
			# C code here to load libraries
			self.__loaded = True
			return True
		except:
			return False
	
	def unload(self):
		"""unloads libraries"""
		try:
			# C code here to unload libraries
			self.__loaded = False
			return True
		except:
			return False
	
	def start(self):
		self.__active = True
	
	def stop(self):
		self.__active = False
	
	def run(self):
		"""fills the queue (if active)"""
		if self.__active:
			# C code here to fill the queue
			pass

Verfasst: Samstag 26. April 2008, 10:46
von BlackJack
Ich würde da ja Pyrex bzw. besser Cython vorschlagen, oder die Klasse in Python schreiben und die C-Teile mit `ctypes` einbinden.

Verfasst: Samstag 26. April 2008, 11:04
von droptix
Ist `ctypes` nicht relativ lahm? Cython ist recht interessant, aber wieder neu für mich. In Python und C-Module hatte ich mich grad ein wenig eingearbeitet... es ist ja kein Riesen-Modul, daher dachte ich an den üblichen und "sauberen" Weg über ein komplett compiliertes C-Modul als Windows-DLL, die in .pyd umbenannt wird.

Eine meiner Hauptfragen ist auch, ob ich überhaupt in meinem C-Modul von Pythons `Queue.Queue` erben bzw. es als BaseClass verwenden kann oder ob ich das komplett nachbilden müsste.

Gibt's hier jemanden im Python-Forum, der sowas überhaupt schonmal gemacht hat, also eine bestimmte Funktion in C auslagern... oder noch spezieller: eine Windows-spezifische Sache in C programmieren und dann für Python als C-Modul bereit stellen???

Verfasst: Samstag 26. April 2008, 11:21
von BlackJack
Warum sollte `ctypes` lahm sein? Und ist die Geschwindigkeit der nicht letztlich egal? Du betreibst ja kein Polling mehr, also geht auch nichts verloren.

Ich würde erst einmal so viel wie möglich in Python schreiben und dann schauen ob man es noch irgendwie beschleunigen muss.

Pyrex/Cython würde ich als den "saubereren" Weg betrachten eine "C-Erweiterung" für Python zu schreiben, weil einem dann der ganze "boiler plate"-Code mit Referenzzählen und Ausnahmen abgenommen wird. Wenn man das per Hand schreibt, vergisst man gerne auch mal etwas.