== 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:
{{{
#!/bin/sh
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:
{{{
#!/usr/bin/env python
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: <<BR>>
'''You will need the Python Development package installed on UNIX systems for distutils to work correctly.'''  <<BR>>
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 <<BR>> ''follow the basic apache installation for your operating system as described in other
parts of the !MoinMoin documentation'' <<BR>> 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:
 1. Welche !MoinMoin-Dateien müssen in das ".htaccess-Verzeichnis" kopiert werden?
 2. Was bedeutet `<Files wiki>`? Und über welche URL muss ich dann das .htaccess-Verzeichnis ansprechen? http://irgendwas.de/.htaccess-Verzeichnis/wiki ?
 3. Benötige ich evtl. noch eine `DirectoryIndex`-Anweisung?
 4. Wie muss ich die !PythonPath Zeile anpassen (Beispiel erbeten) und vor allem was bewirkt diese Zeile? Ist `PythonPath` eine Variable?

Probiert habe ich:
 1. 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).
 2. 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.