How To: Snow Leopard + MySQL + Python + web2py

Da mein Vater ja sehr viel mit Python entwickelt, und speziell mit web2py, musste das natürlich auch auf seinem neuen MacBook installiert werden. Da ich gestern jedoch knapp 3 Stunden vor dem MacBook saß, um das hinzukriegen, hier ein kleines How To, um das Problem möglicherweise gepflegt zu lösen. Ich muss dazu jedoch sagen, dass es das allererste Problem war, bei dem mein Vater oder ich nicht auf Anhieb eine Lösung wussten bzw. gefunden haben...
Als erstes braucht man natürlich einen frischen Mac mit Snow Leopard. Wichtig ist für diese Anleitung, dass er recht frisch ist, da ich nicht weiß, was passiert, wenn man einen Mac mit Leopard und bereits installiertem, möglicherweise 32bittigem MySQL und Python auf Snow Leopard updatet und dann mein How To befolgt, aber genug der Verwirrungen, legen wir los.
Als ersten Schritt sollte man Python installieren. Leider kann ich nicht mehr genau nachvollziehen, was vorher war und was ich gefrickelt habe, daher kann ich euch nur sagen, was ich gemacht habe. Ich habe zuerst Python 3.1.1 installiert. Da ich später erfahren habe, dass web2py Python 2.5 benötigt, habe ich das einfach mal drüberinstalliert. Ich habe jedoch das Gefühl, dass Python 2.5 bereits mit Python 3.1.1 mitinstalliert wurde, genau sagen kann ich es aber nicht. In beiden Fällen habe ich das .dmg verwendet.
Der nächste Schritt ist die Installation von MySQL. Dazu lädt man sich MySQL 5.1 GA im Package-Format für Mac OS X herunter. Dabei ist es sehr wichtig, die Version für Mac OS X 10.5 x86_64 zu nehmen. Mit der 32bit-Version klappte es nicht, soweit ich das bisher sagen kann, tut mir Leid. Und eine offizielle Version für Snow Leopard hat es nicht. Hier auch wieder bitte das Disk-Image verwenden. Nachdem man das Disk-Image heruntergeladen und geöffnet hat, startet man bitte mit einem simplen Doppelklick die Datei mysql-5.1.39-osx10.5-x86_64.pkg. Damit installiert man MySQL in seiner Grundfassung. Wenn man wünscht, dass MySQL beim Systemstart ebenfalls gestartet wird, installiert man bitte noch MySQLStartupItem.pkg und installiert abschließend noch MySQL.prefPane, welches derzeit leider noch im 32bit-Format vorliegt, wie ich mir habe sagen lassen, aber das macht hier eigentlich nichts. Abschließend zur MySQL-Installation öffnet man die Systemeinstellungen und startet den MySQL-Server.
Nun hat man die Grundlage geschaffen für die Verknüpfung von MySQL mit Python, was aber noch nicht einfach so funktioniert, denn wagt man den Test:
Code:
/usr/bin/python
>>> import MySQLdb
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named MySQLdb
erhält man eben nur die gezeigte (oder eine ähnliche) Ausgabe: MySQL lässt sich in Python noch nicht einwandfrei verwenden.
Nun geht es ein wenig ans Eingemachte. Dazu muss man - soweit ich das bisher feststellen konnte - auf jeden Fall(!) Xcode von der beim Mac mitgelieferten Installations-CD für OS X installieren. Das dauert ein wenig, bei einer SSD geht es natürlich sehr flott, und nimmt einige Gigabyte an Platz weg, aber muss wohl leider sein. Als nächstes lädt man sich MySQL for Python in der neuesten Version herunter. Bei mir war das Version 1.2.2. Hier lädt man sich bitte einfach das Archiv MySQL-python-1.2.2.tar.gz herunter. Dann begibt man sich per Terminal in das Verzeichnis, für gewöhnlich /Users/username/Downloads. Dort macht man bitte Folgendes:
Code:
PATH="/usr/local/mysql/bin:$PATH"
tar xzvf MySQL-python-1.2.2.tar.gz
cd MySQL-python-1.2.2
und editiert dort mit einem beliebigen Texteditor (ich entscheide mich immer wieder für vi) die Datei _mysql.c (Unterstrich am Anfang nicht vergessen). Dort entfernt man die Zeilen:
Code:
#ifndef uint
#define uint unsigned int
#endif
Des weiteren ändert man die Zeilen:
Code:
uint port = MYSQL_PORT;
uint client_flag = 0;
in
Code:
unsigned int port = MYSQL_PORT;
unsigned int client_flag = 0;
Man schreibt uint also quasi nur aus und entfernt die Definition von uint als unsigned int. Dann erzeugt man einen symbolischen Link:
Code:
sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql
Als nächstes editiert man wiederum mit einem beliebigen Texteditor die Datei setup_posix.py. Dort verändert man die Zeile:
Code:
mysql_config.path = "mysql_config"
in
Code:
mysql_config.path = "/usr/local/mysql/bin/mysql_config"
und gibt somit den kompletten Pfad an, da der Compiler die mysql_config sonst nicht finden kann und dann mit einer Fehlermeldung abbricht. Sind alle diese Schritte erfolgreich getan worden, führt man nun folgende Kommandos aus.
Code:
sudo /usr/bin/python setup.py clean
sudo ARCHFLAGS="-arch x86_64" /usr/bin/python setup.py build
sudo /usr/bin/python setup.py install
Damit hat man erfolgreich MySQL und Python verknüpft - falls der Compiler ohne Mucken durchläuft. Nun sollte bei einem Test der Import von MySQLdb erfolgreich vonstatten gehen. Hat man das erledigt, steht einem gepflegten web2py-Start nichts mehr im Weg, denkt man. Lädt man sich also web2py in der Mac-Version herunter und startet web2py.app, läuft alles wie am Schnürchen. Bis man versucht, Datenbanken zu verwenden. Dann nämlich erscheint immer wieder folgender Fehler: "NameError: global name 'MySQLdb' is not defined". Tja, langes, langes Suchen brachte mich schließlich darauf, mal web2py in der Source-Code-Version auszuprobieren. Archiv ausgepackt, im Terminal per "python web2py.py" gestartet, brachte es das gleiche Ergebnis wie oben. Dann per "python2.5 web2py.py" versucht. Kein Erfolg. Und dann fiel es mir wie Schuppen von den Augen: Oben hatte ich den kompletten Pfad zu /usr/bin/python verwendet. Das sollte garantieren, dass ich auf jeden Fall die richtige Version von Python verwende. Nun "/usr/bin/python web2py.py" ausprobiert und oh Wunder: Es klappte alles hervorragend. Mein Vater kann nun also ohne Probleme seine Arbeit, die er unter Windows mit web2py gemacht hat, unter Mac OS X fortführen. Ich muss aber zugeben: Unter Windows klappt das hier einfacher.
Hier habe ich also meinen Lösungsweg für ein Problem, an dem ich 3 Stunden gesessen habe. Andere Menschen berichten von 3 Tagen, können mir mit ihren Erkenntnissen aber durchaus weiterhelfen. Im Grunde habe ich hier nicht viel mehr gemacht, als die Erkenntnisse von hier und da, da und dort zusammenzuwerfen und eine sinnvolle, deutsche Anleitung daraus zu formulieren. Denn genau das fehlt meiner Meinung nach: Eine sinnvolle Anleitung.

Dieses How To findet man auch hier.

Wer Verbesserungsvorschläge oder vielleicht eine bessere, einfachere, sauberere Lösung anzubieten hat, darf sich gerne melden :)
 
Zuletzt bearbeitet:
Zurück
Oben