django: ausgelagerte Applikation lässt sich nicht einbinden

Django, Flask, Bottle, WSGI, CGI…
Antworten
thomst
User
Beiträge: 13
Registriert: Montag 26. April 2010, 18:40

Samstag 10. September 2011, 18:02

Hallo zusammen,
ich habe ein triviales Problem, finde aber einfach keine Lösung. Ich möchte in einem Projekt eine Applikation anwenden, die außerhalb des Projektordners angelegt ist. Die Applikation befindet sich auf dem Pythonpath und lässt sich in einer python-Konsole problemlos importieren.
In meiner projekt/settings.py-Datei gebe ich den Application-Namen in INSTALLED_APPS an. Wenn ich aber den Testserver starte bekomme ich stets die Fehlermeldung: no module named "myapp".
Ich habe schon den halben Tag damit verbracht nach einer Lösung zu suchen, aber nichts gefunden. Kann mir bitte, bitte jemand helfen? Das wäre sehr nett!

beste Grüße,
thomst
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Samstag 10. September 2011, 19:20

Kannst du das Modul in der `settings.py` importieren? (Also nicht via INSTALLED_APPS sondern wie in anderem Pythoncode auch)
thomst
User
Beiträge: 13
Registriert: Montag 26. April 2010, 18:40

Sonntag 11. September 2011, 09:51

Hi Dauerbaustelle,
danke für deine Antwort. Innerhalb der settings-Datei lässt sich die Applikation ebenfalls nicht importieren:

Code: Alles auswählen

Error: Can't find the file 'settings.py' in the directory containing 'manage.py'. It appears you've customized things.
You'll have to run django-admin.py, passing it your settings module.
(If the file settings.py does indeed exist, it's causing an ImportError somehow.)
Das Problem lässt sich mit einem Symlink lösen. Dennoch frage ich mich warum sich die Applikation nicht über den Pythonpath importiert werden kann. Wenn ich es richtig verstanden habe, müsste das doch die gängige Praxis sein, oder nicht?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 11. September 2011, 10:09

Dazu müsste man mal deinen Pythonpath kennen und wo das Projekt und die Anwendungen liegen.
thomst
User
Beiträge: 13
Registriert: Montag 26. April 2010, 18:40

Sonntag 11. September 2011, 13:00

Hi,
also: ich habe einen Ordner namens "django" in meinem Homeverzeichnis, und einen Unterordner namens "applications". Das Projekt selbst liegt in einem weiteren Ordner meines Homeverzeichnisses.
Die Datei ".bashrc" habe ich um folgenden Eintrag erweitert:

Code: Alles auswählen

export PYTHONPATH='/home/thomas/django/applications'
Eine Pythonkonsole gibt mir folgendes aus für sys.path:

Code: Alles auswählen

>>> import sys
>>> sys.path
['', '/home/thomas/django/applications', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/pymodules/python2.6', '/usr/lib/pymodules/python2.6/gtk-2.0']
>>> 
Und wie gesagt lässt sich die Applikation anstandslos importieren.

Was mir jetzt dazu einfällt: Die .bashrc-Datei befindet sich in meinem Homeverzeichnis. Also werden alle dortigen Konfigurationen wohl auch nur in diesem Benutzerspezifischem Kontext wirksam, vermute ich. Muss ich also die Variable PYTHONPATH eventuell an anderer Stelle exportieren?

edit: Anders gefragt: in welchem Kontext startet der testserver von django den Pythoninterpreter?
thomst
User
Beiträge: 13
Registriert: Montag 26. April 2010, 18:40

Sonntag 11. September 2011, 13:41

ok. Ich habe ein kleines Startscript für den testserver, das zu allererst PYTHONPATH modifiziert und exportiert und anschließend den testserver startet. Auf diese Weise funktionierts.
Nur noch eine Frage: Um die Umgebungs-Variable systemweit anzupassen eignet sich die Datei /etc/enviroment ? Dort wird bei mir die PATH-Variable definiert. Kann ich dort gleichfalls die PYTHONPATH-Variable definieren? Und ist sie dann gleich wer sich wie beim System anmeldet verfügbar?
Vielen Dank jedenfalls schon mal.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 11. September 2011, 18:37

Öh wenn du den Server aus einer Bash heraus startest hat er ja das Bash-Environment. Vergleich' doch mal den Syspath in settings.py mit dem in einer interaktiven Konsole. (bzw in der Python-Konsole und in der Django-Python-Konsole)
deets

Sonntag 11. September 2011, 20:45

thomst hat geschrieben:ok. Ich habe ein kleines Startscript für den testserver, das zu allererst PYTHONPATH modifiziert und exportiert und anschließend den testserver startet. Auf diese Weise funktionierts.
Nur noch eine Frage: Um die Umgebungs-Variable systemweit anzupassen eignet sich die Datei /etc/enviroment ? Dort wird bei mir die PATH-Variable definiert. Kann ich dort gleichfalls die PYTHONPATH-Variable definieren? Und ist sie dann gleich wer sich wie beim System anmeldet verfügbar?
Vielen Dank jedenfalls schon mal.
Ich wuerde das nicht so machen. Du kannst auch ein python-wrapper-skript schreiben, welches sys.path entsprechend modifiziert.

Denn eine globale Umgebungsvariable ist immer eine schlechte Idee - was machst du, wenn du einen andern Pfad fuer ein anderes Projekt brauchst?
thomst
User
Beiträge: 13
Registriert: Montag 26. April 2010, 18:40

Montag 12. September 2011, 10:41

Dauerbaustelle hat geschrieben:Öh wenn du den Server aus einer Bash heraus startest hat er ja das Bash-Environment. Vergleich' doch mal den Syspath in settings.py mit dem in einer interaktiven Konsole. (bzw in der Python-Konsole und in der Django-Python-Konsole)
Also ich habe zwei Fälle untersucht: Ich hatte auf meinem Ubuntu-System einen Anwendungsstarter für jedes Django-Projekt angelegt. Dieser ruft ein kleines Startskript auf, das zunächst in den Projektordner wechselt und dann den testserver startet über das manage.py-Modul. Dieser Anwendungsstarter startet den Testserver in einem Terminal. Tatsächlich scheint in diesem Terminal die .bashrc-Konfigurationen nicht wirksam zu werden. Denn wenn ich den Sys.path in meiner Settingsdatei auslese, bleibt mein Pythonpath von den Angaben der .bashrc unberührt.
Wenn ich allerdings den Testserver in einem Terminal starte (ohne zwischen gelagertes Startskript) habe ich die .bashrc-Konfigurationen drin.
deets hat geschrieben: Ich wuerde das nicht so machen. Du kannst auch ein python-wrapper-skript schreiben, welches sys.path entsprechend modifiziert.

Denn eine globale Umgebungsvariable ist immer eine schlechte Idee - was machst du, wenn du einen andern Pfad fuer ein anderes Projekt brauchst?
Da ich ohnehin für jedes Projekt ein Startskript anlege (denn jedes Projekt hat einen anderen Projektordner und nutzt den Testserver auf einem anderen Port), scheint es mir ziemlich unproblematisch in dem jeweiligen Startskript noch eine modifizierten Pythonpath zu exportieren.
Etwas anderes ist es allerdings wenn ich das Projekt über meinen Apacheserver laufen lasse. Aber in dem Fall müsste ich in der jeweiligen django.wsgi-Datei den sys.path direkt erweitern können.
deets

Montag 12. September 2011, 12:30

thomst hat geschrieben: Da ich ohnehin für jedes Projekt ein Startskript anlege (denn jedes Projekt hat einen anderen Projektordner und nutzt den Testserver auf einem anderen Port), scheint es mir ziemlich unproblematisch in dem jeweiligen Startskript noch eine modifizierten Pythonpath zu exportieren.
Etwas anderes ist es allerdings wenn ich das Projekt über meinen Apacheserver laufen lasse. Aber in dem Fall müsste ich in der jeweiligen django.wsgi-Datei den sys.path direkt erweitern können.
Ersteres ist natuerlich auch ok, aber dein voriger Post hoerte sich so an, als ob du global fuer alle User PYTHONPATH setzen willst.

Und zweiteres ist ja genau das, was ich vorschlug.
thomst
User
Beiträge: 13
Registriert: Montag 26. April 2010, 18:40

Montag 12. September 2011, 12:56

deets hat geschrieben:Und zweiteres ist ja genau das, was ich vorschlug.
Du hast natürlich recht. Ich musste mir zunächst noch mal vergegenwärtigen, wie denn der Apache-server auf mein django-Projekt zugreift. Und dabei ist mir erst klar geworden, dass ich den sys.path direkt in der django.wsgi-Datei anpassen kann.

edit: allerdings würde ich auch gerne allgemein wissen, wo ich denn am sinnvollsten die PYTHONPATH-Variable systemweit anpasse/definiere. Ist dafür /etc/enviroment der richtige Ort?
deets

Montag 12. September 2011, 13:55

Du solltest es nicht tun, das habe ich ja schon vorher erwaehnt. Denn es produziert schwer zu verstehendes Verhalten fuer die Benutzer des Systems.
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Sonntag 4. Dezember 2011, 18:24

Ich würde Django neu herunterladen und es per "python2 setup.py install" installieren.

Danach die Tutorial-Schritte zum erstellen eines Projektes und einer App nachvollziehen.

Wie heißt der Ordner wo die App drinliegt (hoffentlich doch myapp!) wenn nicht solltest du den Ordnernamen verwenden.

Poste einfach mal deine Settings.py per Pastebin und eine Auflistung des Verzeichnisbaums deines Projekt-Ordners.

Danke,

Maik
LG Maik
Antworten