Seite 1 von 1
Python2.6 unter Debian nutzen
Verfasst: Sonntag 5. Juli 2009, 10:10
von orschiro
Hallo Leute,
bisher habe ich mein Django-Projekt nur lokal genutzt und weiterentwickelt. Jetzt wird es allerdings Zeit, dieses auf meinen Webserver zu packen. Dieser läuft derzeit unter Debian Squeeze (Testing). Da ich lokal Python 2.6.2 einsetze, wollte ich dieses auch auf meinem Server nutzen.
Nur habe ich dort feststellen müssen, dass es Python2.6. lediglich in Experimental gibt.
Jetzt habe ich mir von dort python2.6 sowie python2.6-minimal heruntergeladen und lokal mittels dpkg -i <packet> installiert. Weiterhin installiert habe ich nach wie vor python 2.5.4. Sollte ich dieses runterschmeißen, oder kommen sich die beiden Versionen grundsätzlich sowieso nicht in die Quere?
Und wie sage ich Django, dass er auf meinem Server eben dieses python2.6 zurückgreifen soll?
Danke und Grüße

Verfasst: Sonntag 5. Juli 2009, 11:29
von Leonidas
Hängt ab wie du Django deployen willst.
Achja, grundsätzlich kann man in Debian die Python-Pakete regulär nebeneinander installiert haben, das ist kein Problem.
Verfasst: Sonntag 5. Juli 2009, 11:57
von orschiro
Hängt ab wie du Django deployen willst.
Könntest du das vielleicht etwas genauer erklären?
Grüße
Verfasst: Sonntag 5. Juli 2009, 15:37
von Leonidas
orschiro hat geschrieben:Könntest du das vielleicht etwas genauer erklären?
Was davon willst du denn nutzen: CGI, FastCGI, mod_wsgi, HTTP Proxying?
Verfasst: Sonntag 5. Juli 2009, 17:24
von orschiro
Geplant ist eigentlich mod_wsgi in Verbindung mit Apache2, da es, so wie ich das gelesen habe, das Zukunftsicherste ist.
Grüße
Verfasst: Sonntag 5. Juli 2009, 19:36
von Leonidas
orschiro hat geschrieben:Geplant ist eigentlich mod_wsgi in Verbindung mit Apache2, da es, so wie ich das gelesen habe, das Zukunftsicherste ist.
Dann musst du mod_wsgi gegen Python 2.6 kompilieren. Oder FastCGI nutzen, da ist es trivial, da es nicht gegen die libpython gelinkt werden muss (da reicht es den/die Shebang anzupassen und auf Python 2.6 zu stellen).
Verfasst: Sonntag 5. Juli 2009, 21:03
von orschiro
Gut, also ich bin jetzt folgendermaßen vorgegangen:
Symlink erstellen zu Python2.6
Code: Alles auswählen
ln -s `pwd`/django-trunk/django /usr/lib/python2.6/dist-packages/django
Danach noch einen Symlink zu /usr/local/bin
Code: Alles auswählen
ln -s `pwd`/django-trunk/django/bin/django-admin.py /usr/local/bin
Führe ich nun in einem Verzeichnis django-admin.py startproject projekt aus, erhalte ich folgende Fehlermeldung:
Code: Alles auswählen
Traceback (most recent call last):
File "/usr/local/bin/django-admin.py", line 2, in <module>
from django.core import management
ImportError: No module named django.core
Starte ich hingegen python2.6 in der Konsole, kann ich django per import django problemlos importieren. Mittels python funktioniert das logischerweise nicht, da python2.5 Django auch nicht importieren soll.
Eine Idee?
Verfasst: Sonntag 5. Juli 2009, 21:28
von Leonidas
Du musst in der ersten Zeile von ``django-admin.py`` angeben dass python 2.6 benutzt werden soll.
Verfasst: Sonntag 5. Juli 2009, 21:36
von orschiro
Daran habe ich auch schon gedacht, allerdings müsste ich dies ja nach jedem Trunk Update wiederholen, da die Abänderung überschrieben werden würde oder?
Zumal zieht sich das ja durch das gesamte Projekt durch. Sprich ich müsste die manage.py entsprechend abändern und weitere Dateien sicherlich auch.
Verfasst: Sonntag 5. Juli 2009, 22:00
von Leonidas
orschiro hat geschrieben:Daran habe ich auch schon gedacht, allerdings müsste ich dies ja nach jedem Trunk Update wiederholen, da die Abänderung überschrieben werden würde oder?
Du kannst auch die Mercurial-Version verwenden und dort einen mq-Patch anlegen, denn du bei jedem Update einfach nochmal anwenden lässt. Andererseits ist ``django-admin.py`` eine so kurze Datei, dass da eh nie Änderungen anstehen und somit kann man die Datei auch "dirty" ewig mitziehen.
Django in Mercurial zu managen ist sowieso viel praktischer als via SVN, da ich so auch die Patches die nicht in Django aufgenommen worden sind sehr einfach verwalten kann und nach Lust und Laune applizieren und auch wieder entfernen kann.
orschiro hat geschrieben:Zumal zieht sich das ja durch das gesamte Projekt durch. Sprich ich müsste die manage.py entsprechend abändern und weitere Dateien sicherlich auch.
Nein, das wären schon alle. Die alternative wäre natürlich ``python2.6 manage.py`` auszuführen, das geht natürlich auch.
Persönlich habe ich in ``/usr/local/bin`` einen Symlink ``python`` auf ``/usr/bin/python2.6`` angelegt und die Angelegenheit so gelöst. Ist natürlich nicht für jedes Problem die richtige Lösung, für meine Bedürfnisse war es aber genau das richtige.
Verfasst: Sonntag 5. Juli 2009, 22:11
von orschiro
Vielen Dank für deine Tipps. Ich würde gerne mit der Variante "Ändere django-admin.py und manage.py ab" fahren, den Symlink finde ich persönlich nicht so praktisch, da dann sämtliche Programme python 2.6 verwenden würden. Ich weiß nicht wie sinnvoll das wäre, Python steckt bei Debian vielleicht nicht grundlos in experimental.
Also jedenfalls habe ich jetzt die beiden Dateien folgendermaßen abgeändert:
Code: Alles auswählen
Statt
#!/usr/bin/env python
steht in beiden nun
#!/usr/bin/env python2.6
django-admin.py startproject projekt konnte ich nun auch problemlos ausführen. Führe ich allerdings den Befehl
python manage,py runserver aus, nimmt er nach wie vor python2.5, obwohl ich in der manage.py selbst was anderes festgelegt habe. Sprich hier muss ich trotz der Dateiabänderung weiterhin
python2.6 manage.py runserver benutzen?
Anders gesagt, ich kann mir das Abändern der manage.py sparen?
Verfasst: Sonntag 5. Juli 2009, 22:22
von Leonidas
Shebang wird nur ausgewertet wenn du das Skript als Executable ausführst. Also wenn du ``python manage.py`` ausführst, wird ``manage.py`` von dem Python ausgeführt, was sich auf deinem System unter ``python`` meldet. Genauso kannst du auch ``python2.2 manage.py`` oder ``python3.1 manage.py`` ausführen, vorrausgesetzt du hast diese Versionen installiert (das ist natürlich nur ein Beispiel, Django läuft weder mit 2.2 noch mit 3.1).
Du kannst dir das abändern beider Dateien sparen, wenn du die Dateien explizit mit einem Interpreter startest. Das habe ich dir aber auch schon gesagt.
Eine weitere Möglichkeit ist natürlich, den Symlink zu ``django-admin.py`` durch ein Skript zu wie dieses zu ersetzen:
Verfasst: Sonntag 5. Juli 2009, 22:29
von orschiro
Leonidas hat geschrieben:Shebang wird nur ausgewertet wenn du das Skript als Executable ausführst. Also wenn du ``python manage.py`` ausführst, wird ``manage.py`` von dem Python ausgeführt, was sich auf deinem System unter ``python`` meldet.
Gut, aber dann wird doch der Shebang überhaupt keine Beachtung geschenkt oder verstehe ich das falsch? Ich meine, selbst wenn ich das Script per python manage.py starte, muss er doch registrieren, dass er eigentlich python2.6 verwenden sollte, weil es eben in der Shebang steht.
Leonidas hat geschrieben:
Du kannst dir das abändern beider Dateien sparen, wenn du die Dateien explizit mit einem Interpreter startest. Das habe ich dir aber auch schon gesagt.
In dem ich also einen Symlink von python2.6 auf python setze richtig?
Aber dann würden, wie bereits erwähnt, alle Programm python2.6 einsetzen und nicht mehr 2.5.
Grüße
Verfasst: Sonntag 5. Juli 2009, 22:38
von Leonidas
orschiro hat geschrieben:Gut, aber dann wird doch der Shebang überhaupt keine Beachtung geschenkt oder verstehe ich das falsch? Ich meine, selbst wenn ich das Script per python manage.py starte, muss er doch registrieren, dass er eigentlich python2.6 verwenden sollte, weil es eben in der Shebang steht.
Du verstehst das Konzept der Shebang nicht:
Gehen wir von diesem Skript aus, nehmen wir an, es steht in ``~`` und ist executable (+x).
Nun bin ich auch in ~ und möchte es ausführen: ``./hallo``. Dann schaut der Kernel ob es ausführbar ist und wenn ja, dann wertet er die erste Zeile aus: ``/usr/bin/python ~/hallo`` wird aufgerufen. Fein, funktioniert auch. Aber wenn ich nun ``ruby hallo' eintippe, dann wird sofort der Ruby-Interpreter gestartet und für den ist die erste Zeile einfach nur ein Kommentar und er führt den nicht kommentierten Code aus.
Heißt also: Shebang wird nur ausgewertet wenn du das Skript als Executable ausführst, wenn du es als Parameter dem Python-Interpreter mitgibst, dann ist es dem herzlich egal ob da etwas drin steht und was da drin steht. Für ihn ist es ein Kommentar.
Also: entweder mit dem richtigen Interpreter aufrufen, oder Shebang entsprechend setzen.
orschiro hat geschrieben:In dem ich also einen Symlink von python2.6 auf python setze richtig?
Nein, falsch. Indem du ``python2.6 /usr/local/bin/django-admin.py`` und ``python2.6 manage.py`` ausführst. Wie du siehst, übergebe ich in beiden Fällen die auszuführende Datei als Parameter und somit ist es dem Interpreter total egal was im Shebang steht, daher ist es egal ob da jetzt ``#!/usr/bin/env python`` oder ``#!/usr/bin/env python2.6`` drin steht. Aber _nur_ in diesem Fall. Wenn du ``django-admin.py`` und ``./manage.py`` ausführst, dann wird Shebang ausgewertet und muss dementsprechend auch stimmen.
Verfasst: Sonntag 5. Juli 2009, 23:01
von orschiro
Und nochmals danke,
jetzt habe ich das verstanden.
Dann mache ich beide so wie du sagst ausführbar und gut ist.
Sicherheitsrelevante Aspekte ergeben sich dadurch wohl weniger oder?
Verfasst: Sonntag 5. Juli 2009, 23:16
von Leonidas
Nein, das Ausführbarkeits-Bit hat keine Sicherheitsimplikationen die du ohne das Bit nicht genauso hättest (die gäbe erst das Suid-Bit, aber das funktioniert auf Skripten sowieso nicht).
Verfasst: Sonntag 5. Juli 2009, 23:21
von orschiro
Damit wäre das Thema erledigt - danke.
