Antrieb, warum diese Seite?
Ich habe die letzten beiden Tage - wirklich 48 Stunden - versucht Moin Moin auf mod_python Basis bei Hosteurope zu installieren, leider bis jetzt ohne Erfolg. Natürlich läuft MoinMoin bei mir seit langem auf dem Linux-Rechner zuhause, doch kann die DynDns.org-Lösung nicht der Weisheit letzter Schluss bleiben.
Als Informationsquelle habe ich auch das IRC (Dank an Lydon) genutzt und bin dort zwei weiteren Personen begegnet, die genau das gleiche Problem hatten, wobei von einem sogar ein Rootserver erwogen wurde (eigens für MoinMoin!).
Etwas Kritik an der Doku
Vorweg: insgesamt finde ich die Dokumentation (INSTALL.html) sehr gut. Allerdings hilft der mod_python Abschnitt vermutlich nur jenen, die einen Shell-Zugang besitzen. Webhosting mit Shellzugang ist aber m.E. eher die Ausnahme und FTP die Regel.
Im gleichen Abschnitt heißt es follow the basic apache installation. Gemeint ist damit vermutlich python setup.py --quit install --prefix /pfad/, ein Hinweis, welcher Stand genau vorausgesetzt wird, wäre hier sehr hilfreich.
Die Information, wie man ohne Shellzugang python setup.py ... aufrufen kann, versteckt sich - kurz angerissen - im Abschnitt Installation into your home directory. Ein genialer Trick, der sofern die Ausführbarkeitsrechte gesetzt sind, auch funktioniert:
echo "Content-Type: text/html" echo "" echo "<html><head>" echo "</head><body>" echo "<h1>welche Python-Version hat der Webhoster?</h1>" echo "<h1>Hello World in /bin/sh</h1>" /usr/bin/python -V 2>&1 echo "</body>" echo "</html>"
2>&1 leitet den Fehlerkanal auf die Standardausgabe und damit an den Browser weiter. Auf dem gleichen Wege geht dann auch ein
/usr/bin/python -c "print 12345"
was zum austesten auch ganz hilfreich sein kann. Der Aufruf von
/usr/bin/python ./setup.py --help 2>&1
muss allerdings wieder scheitern. Schuld daran ist, wie ich in der Zwischenzeit herausgefunden habe, dass der entsprechende HTTP-Header fehlt. Hier kann Abhilfe geschaffen werden. Nach einer kleinen Änderung (Zeile 2+3) an der setup.py sehen die ersten Zeilen so aus:
print "Content-Type: text/html" print # Empty line for end of header # -*- coding: iso-8859-1 -*-
Nun spricht das Setup-Programm (auf Hosteurope) Klartext:
File "./setup.py", line 17, in ? import distutils ImportError: No module named distutils
Ein ernüchternder Fehler, denn an anderer Stelle in INSTALL.html fand ich den Hinweis:
You will need the Python Development package installed on UNIX systems for distutils to work correctly.
Doch vermutlich kann ich Hosteurope nicht davon überzeugen, das Devel-Paket nachzuinstallieren
Trotzdem, wer so schnell klein beigibt, ist selbst schuld. Hosteurope hat derzeit Python 2.2.1 installiert. Die gleiche Version ist z.B. in SuSE 8.0 enthalten, welches noch auf meinem Laptop herumlungert. Dort funktioniert natürlich das Ausführen von Setup setup.py mit --prefix wie oben beschrieben. Den generierten Verzeichnisbaum mit den Verzeichnissen (bin, lib, share) habe ich als "moin-basis" per FTP hochgeladen. Den Tipp bekam ich im IRC. Über Hinweise wie sinnvoll, bzw. wie erfolgsversprechend dieser (hier weiter beschriebene) Ansatz ist, wäre ich sehr dankbar.
Doch der weitere Verlauf ist mir jetzt noch unklar. Ich gehe einfach mal davon aus, dass der in der mod_python Sektion der Anleitung geforderte Voraussetzung
follow the basic apache installation for your operating system as described in other parts of the MoinMoin documentation
genüge getan ist.
Weitere Fragen
Obwohl mir die Datei .htaccess eigentlich nicht neu ist, holt mich mein ausgeprägtes Apache Halbwissen nun ein. Die Originaldatei moin_modpy.htaccess enthält eigentlich nur die folgenden Zeilen:
<Files wiki> # Use mod_python as handler SetHandler python-program # add the path where the moin_modpy.py wrapper can be found PythonPath "['/path/to/moin/share/moin/cgi-bin']+sys.path" # use the moin_modpy wrapper to handle requests PythonHandler moin_modpy </Files>
Unklar ist mir:
Welche MoinMoin-Dateien müssen in das ".htaccess-Verzeichnis" kopiert werden?
Was bedeutet <Files wiki>? Und über welche URL muss ich dann das .htaccess-Verzeichnis ansprechen? http://irgendwas.de/.htaccess-Verzeichnis/wiki ?
Benötige ich evtl. noch eine DirectoryIndex-Anweisung?
Wie muss ich die PythonPath Zeile anpassen (Beispiel erbeten) und vor allem was bewirkt diese Zeile? Ist PythonPath eine Variable?
Probiert habe ich:
Die abgeänderte (s.u.) Datei moin_modpy.py in das cgi-bin Verzeichnis zu kopieren (das einzige Verzeichnis, in dem bei Hosteurope CGI´s ausgeführt werden).
Die in .htaccess umbenannte und geänderte Datei (s.u.) moin_modpy.htaccess in ein Verzeichnis test hochzuladen (ansonsten ist test leer).
Datei .htaccess in "cgi-bin"
import sys sys.path[0:0]=['/is/htdocs/12345/www.xyz.de/moin-basis/lib/python2.2/site-packages/', '/is/htdocs/12345/www.xyz.de/moin-basis/lib/python2.2/site-packages/MoinMoin/config.py'] from MoinMoin.request import RequestModPy def handler(request): moinreq = RequestModPy(request) return moinreq.run(request)
Datei .htaccess in "test"
<Files wiki> # Use mod_python as handler SetHandler python-program # add the path where the moin_modpy.py wrapper can be found # PythonPath "['/path/to/moin/share/moin/cgi-bin']+sys.path" PythonPath "['/is/htdocs/12345/www.xyz.de/cgi-bin/']" # use the moin_modpy wrapper to handle requests PythonHandler moin_modpy </Files>
Wenn ich nun versuche auf http://www.xyz.de/test/ zuzugreifen, erhalte ich im Apache error-log:
Invalid command 'PythonPath', perhaps mis-spelled or defined by a module not included in the server configuration
Was tun? Vielen Dank im voraus!
- bring es doch einfach erstmal als cgi, ohne mod_python zum laufen
- abklären, ob der hoster überhaupt mod_python installiert hat und wenn ja, welche version. nicht aktuelle versionen hatten so diverse bugs, lydon weiss mehr.
- dass distutils in manchen distributionen (debian z.B.) im -dev-Paket enthalten ist, wird von vielen Python-Entwicklern als Fehler betrachtet, weil es eben nicht (nur) zur entwicklung, sondern auch zum installieren gebraucht wird
- beim hoster das -dev paket anfordern
- beim linux distributor bug-report einwerfen
- man kann mit etwas erfahrung und verständnis von moinmoin auch prima ohne distutils auskommen
- url /wiki muss so auflösen, dass darunter das verzeichnis css und img gefunden wird
- moin.cgi (o.ä.) muss gestartet werden und als erstes sys.path so hinbiegen, dass das Verzeichnis oberhalb von MoinMoin/ eben in sys.path enthalten ist - egal wo es sich befindet
- wenn sich der hoster zu bloed anstellt, kannst evtl auch ein python2.3 in dein home-verzeichnis installieren - inklusive distutils, pfad dann eben oben in moin.cgi entsprechend hinbiegen
bevor man sich nen rootserver "NUR" für ein Wiki rauslässt: http://wikiwikiweb.de/
Ergebnisse Versuch: MoinMoin als CGI
- mod_cgi scheint es bei Hosteurope gar nicht zu geben, nur die CGI Variante
Unterhalb meines cgi-bin Verzeichnisses habe ich test angelegt
moin.cgi angepasst: sys.path.append('/is/htdocs/12345/www.xyz.de/moin-basis/lib/python2.2/site-packages')
dann habe ich die Verzeichnissäste css und img (aus classic) in test hochgeladen
und schließlich die test-Seite aufgerufen: http://www.xyz.de/cgi-bin/test/moin.cgi?test Das Ergebnis ist schon fast mehr als ich erwartet habe:
MoinMoin CGI Diagnosis ====================== Package "MoinMoin" successfully imported. Traceback (innermost last): File "/is/htdocs/12345/www.xyz.de/cgi-bin/test/moin.cgi", line 23, in ? request = RequestCGI() File "/is/htdocs/12345/www.xyz.de/moin-basis/lib/python2.2/site-packages/MoinMoin/request.py", line 503, in __init__ RequestBase.__init__(self, properties) File "/is/htdocs/12345/www.xyz.de/moin-basis/lib/python2.2/site-packages/MoinMoin/request.py", line 63, in __init__ self.dicts = self.initdicts() File "/is/htdocs/12345/www.xyz.de/moin-basis/lib/python2.2/site-packages/MoinMoin/request.py", line 223, in initdicts dicts.scandicts() File "/is/htdocs/12345/www.xyz.de/moin-basis/lib/python2.2/site-packages/MoinMoin/wikidicts.py", line 253, in scandicts pagelist = wikiutil.getPageList(config.text_dir) File "/is/htdocs/12345/www.xyz.de/moin-basis/lib/python2.2/site-packages/MoinMoin/wikiutil.py", line 275, in getPageList pages = os.listdir(text_dir) OSError: [Errno 2] No such file or directory: 'wiki/data/text'
In welchem Verzeichnis sucht er nunr nach wiki/data/text ???
Da das ein relativer Pfad ist, im aktuellen. Vielleicht willst Du aber einfach im aktuellen Verzeichnis eine moin_config.py anlegen und dort nen absoluten Pfad reinschreiben, ist vielleicht etwas definitiver.