modwsgi und einbinden von eigenen Modulen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Moin,
ich habe seit Anfang der Woche auf meinem Rechner (WinXP; Apache 2.2.3; Python 2.5.2; CherryPy version 3.3.1) CherryPy mit modwsgi auf meinem Apache am laufen. Das klappte bisher alles wunderbar. Seit gestern Abend aber komme ich nicht wirklich weiter. Ich wollte ein eigenes Modul in mein CherryPy- Programm einbinden. Das modul habe ich im gleichen Verzeichnis gespeichert wie die Cherrypy App. Nach einigen Fehlermeldungen und suchen im Netz bin ich darauf gekommen das ich dem Apache erst sagen muss wo er nach Modulen suchen soll. Wie auf der Projekthomepage im Wiki beschrieben habe ich dann die in der http.conf die Zeile
WSGIPythonPath E:/www/homepage
eingefügt. Nun wird meine Modul schon mal importiert - allerdings scheint das Modul (meinetwegen MyModule.py) nur genau 1. mal zu MyModule.pyc compiliert zu werden (nennt man das in Python überhaupt compilierein?). Anscheinend nimmt sich modwsgi ein Kopie von der zuerst erstellten Datei MyModule.pyc und arbeitet von da an nur noch mit dieser - denn änderungen die ich an der Datei MyModule.py vornehme haben überhaupt keinen Effekt mehr. Ändere ich den Namenn des Moduls und binde diesen in meine Anwendung ein ist das genau das gleiche Spiel.
Ich habe auch schon versucht eine Kopie der Datei in meinem Dateisystem zu finden aber eine suche nach '*MyModule*' brachte nix zum vorschein was mich überrascht hätte.
Ich weiss im moment auch nich mehr nach was ich bei google suchen soll... vielleicht hat ja jemand von euch nen Hinweis für mich?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Lonestar!
Lonestar hat geschrieben:Wie auf der Projekthomepage im Wiki beschrieben habe ich dann die in der http.conf die Zeile
WSGIPythonPath E:/www/homepage
eingefügt. Nun wird meine Modul schon mal importiert
Das kannst du dir normalerweise sparen, wenn du den Pfad zu den Modulen im Hauptprogramm selbst festlegst. Bevor du importierst, kannst du den Pfad zu den Modulen erweitern. Dieser Pfad ist eine Liste und ist über "sys.path" erreichbar.
Mit ``sys.path.append(...)`` fügst du hinten einen neuen Pfad an. Mit ``sys.path.insert(0, ...)`` fügst du vorne einen neuen Pfad an.

Lonestar hat geschrieben:allerdings scheint das Modul (meinetwegen MyModule.py) nur genau 1. mal zu MyModule.pyc compiliert zu werden (nennt man das in Python überhaupt compilierein?)
Der Apache startet das Programm **nicht** ständig neu. Es wird beim ersten Zugriff gestartet und läuft dann im Hintergrund bis der Apache beendet wird. Wenn du etwas am Programm änderst, dann musst du den Apachen neu starten. Deshalb ist das Entwickeln mit dem Apachen mühsam. Ich entwickle meine CherryPy-Programme so, dass sie komplett ohne den Apachen laufen. Entwickelt wird mit dem in CherryPy eingebauten WSGI-Server. Und wenn das Programm fertig ist, wird es zum Apachen übertragen.

Ich habe noch nichts mit mod_wsgi gemacht. Aber wenn ich damit arbeiten würde, dann gäbe es ein Hauptmodul (z.B. *halvar.py*) welches ohne den Apachen lauffähig wäre. Und es gäbe ein Modul für die Kommunikation mit mod_wsgi. Dieses würde wahrscheinlich *halvar_wsgi.py* heißen. In diesem Modul würde ich alles benötigten Objekte von *halvar.py* importieren und als WSGI-Applikation an mod_wsig übergeben.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Hi Gerold
Das ich den Pfad zu Modulen auch im script festlegen kann kommt mir nun wo du es sagst auch wieder bekannt vor - ich hatte einfach noch nie Verwendung dafür. So gefällt mir das auch besser.
gerold hat geschrieben: Der Apache startet das Programm **nicht** ständig neu. Es wird beim ersten Zugriff gestartet und läuft dann im Hintergrund bis der Apache beendet wird. Wenn du etwas am Programm änderst, dann musst du den Apachen neu starten. Deshalb ist das Entwickeln mit dem Apachen mühsam. Ich entwickle meine CherryPy-Programme so, dass sie komplett ohne den Apachen laufen. Entwickelt wird mit dem in CherryPy eingebauten WSGI-Server. Und wenn das Programm fertig ist, wird es zum Apachen übertragen.
Ja, so wie du es schreibst hatte ich es eigentlich auch verstanden als ich mich durch diverse Anleitungen gekämpft hatte. Als ich dann aber endlich die ganze Kiste hier am laufen hatte viel mir dann auf wenn ich bei laufendem Apache änderungen in der Root-Klasse vornehme das diese Änderungen direkt übernommen werden. Ich hab das einfach mal auf falsches Verständnis meinerseits zurückgeführt und weitergemacht. Da ich keine große Lust habe herauszufinden was noch alles einen Neustart des Apache verlangt werde ich deinem Rat mal folgen und das Entwickeln mit dem eingebauten WSGI- Server machen.

und noch einmal danke für deine Hilfe :roll:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:Wenn du etwas am Programm änderst, dann musst du den Apachen neu starten.
Stimmt so nicht. Bei FastCGI und mod_wsgi reicht ein ``invoke-rc.d apache2 reload`` völlig aus, mod_wsgi unterstützt zusätzlich ``Reload on touch``, aber nur für die Datei die in der Konfiguration eingebunden wurde (und das ist auch gut so, man will ja nicht dass mod_wsgi tausende von Dateien überwacht).

Das erklärt übrigens auch die Beobachtung des OP.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ja, zum Neustarten reicht es, wenn der Benutzer (der nicht root sein muss) ein `touch serve.wsgi` (oder wie das Script sonst heißt, das referenziert wurde)` ausführt.

Zudem erinnere ich mich dunkel, dass birkenfeld irgendwo in den Pocoo-Repositories ein zweiteiliges Progrämmchen hat, was das Masshosting mit mod_wsgi vereinfacht. Oder so.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:Zudem erinnere ich mich dunkel, dass birkenfeld irgendwo in den Pocoo-Repositories ein zweiteiliges Progrämmchen hat, was das Masshosting mit mod_wsgi vereinfacht. Oder so.
Racc wird, soweit ich das weiß auf pyhosting für FastCGI verwendet. Kann sein, dass sich das inzwischen geändert hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten