Seite 1 von 1

Import bei WSGI

Verfasst: Freitag 16. Oktober 2009, 21:33
von MikeScript
Hallo.

In einer "Hallo Welt"-WSGI sollen andere Funktionen und Klassen eingebunden werden. Dazu dachte ich mir folgendes:

Code: Alles auswählen

from . import Primzahl
Die Ordnerstruktur ist wie folgt:
Ordner/main.wsgi
Ordner/Primzahl.py

Dies erzeugt allerdings einen Fehler:
"ValueError: Attempted relative import in non-package"

Wie muss ich das ganze strukturieren, damit ich andere Dateien einbinden kann unter Verwendung eines relativen Pfades?

Verfasst: Freitag 16. Oktober 2009, 21:37
von EyDu
Hallo.

Gehe ich richtig in der Annahme, dass sich dein Script auch im Ordner "Ordner" befindet? Dann sollte ein einfaches

Code: Alles auswählen

import Primzahl
genügen. Primzahl ist allerdings ein recht seltsamer Name für ein Modul. Hinzu kommt, dass er nicht PEP8-konform ist.

Verfasst: Freitag 16. Oktober 2009, 21:43
von MikeScript
Ja sind im gleichen Ordner, wie gezeigt.

Und wie wäre es relativ möglich?

Nun ist der Fehler:
"ImportError: No module named primzahl"

Verfasst: Freitag 16. Oktober 2009, 21:46
von Defnull
Die Datei muss natürlich dann auch primzahl.py und nicht Primzahl.py heissen...

Verfasst: Freitag 16. Oktober 2009, 21:55
von MikeScript
Das tut sie natürlich ;) So kleine Fehler unterlaufen mir nur selten :P
Habs all-lowercase gemacht wie in PEP8 beschrieben.

Verfasst: Freitag 16. Oktober 2009, 22:34
von DasIch
Befindet sich dass Modul in einem Package(Ordner mit einer __init__.py Datei)? In welchem Ordner innerhalb der Ordnerstruktur befindest du dich beim starten des Programms bzw. welcher Ordner ist dass Arbeitsverzeichnis?

Grundsätzlich würde ich dir empfehlen keine relativen Importe zu machen, die stören mehr als dass sie dir helfen.

Verfasst: Freitag 16. Oktober 2009, 22:52
von MikeScript
Es ist eine WSGI Erweiterung für den Apache HTTPD.
Man ruft über den Browser den Ordner auf und darin befindet sich die "main.wsgi" welche als Index deklariert wurde und somit aufgerufen wird.

Die "primzahl.py" befindet sich auf gleicher Ebene und es ist keine __init__.py vorhanden.

Zusätzlich ist (von Eclipse) ein "src" Unterordner angelegt worden.

Die Gesamte Struktur ist also:
%DocumentRoot% / Ordner / src /
%DocumentRoot% / Ordner / main.wsgi
%DocumentRoot% / Ordner / primzahl.py

Verfasst: Freitag 16. Oktober 2009, 23:26
von nemomuk
Schonmal sys.path angeschaut und überprüft ob das aktuelle Verzeichnis auch drin ist?

wenn nicht dann einfach ein sys.path.insert('0, '.'), dann sollte es klappen.

Verfasst: Freitag 16. Oktober 2009, 23:32
von DasIch
MikeScript hat geschrieben:Die "primzahl.py" befindet sich auf gleicher Ebene und es ist keine __init__.py vorhanden.
Was natürlich die Fehlermeldung erklärt, erstell einfach mal eine und schau was passiert.

Verfasst: Freitag 16. Oktober 2009, 23:53
von nemomuk
Was hat die __init__.py damit zu tun, wenn ich im gleichen Verzeichnis ein import primzahl mache?

Verfasst: Samstag 17. Oktober 2009, 01:32
von BlackJack
@ScheiderWeisse: Gar nichts. Aber wenn man ein ``from . import primzahl`` macht, dann eine ganze Menge.

Verfasst: Samstag 17. Oktober 2009, 01:50
von DasIch
SchneiderWeisse hat geschrieben:Was hat die __init__.py damit zu tun, wenn ich im gleichen Verzeichnis ein import primzahl mache?
Gar nichts aber was hat dass mit dem Thema zu tun? Ein ``import primzahl`` taucht nirgends auf.

Verfasst: Samstag 17. Oktober 2009, 07:14
von nemomuk
Naja, wobei das doch hier gar nicht notwendig ist? Was stört euch an einem einfachen "import primzahl"?

Verfasst: Samstag 17. Oktober 2009, 11:23
von MikeScript
Habe eine __init__.py erstellt und "from . import primzahl" klappt nicht.
Ein einfaches import klappt auch nicht nach:

Code: Alles auswählen

import sys
sys.path.insert(0, '.')
Da wird weiterhin "No module named primzahl" gesagt.
Das kann doch nicht so schwer sein eine Datei einzubinden.

Verfasst: Samstag 17. Oktober 2009, 11:30
von Dav1d
ich hab keine Ahnung von wsgi, aber wenn ich eine .py datei importiere (einfach so auf meinem Rechner), wird ein .pyc datei erstellt, vllt liegts ja daran

Verfasst: Samstag 17. Oktober 2009, 11:37
von MikeScript
Den Binärcode habe ich schon mehrfach gelöscht und Apache auch neu gestartet, Browsercache geleert etc.

Verfasst: Samstag 17. Oktober 2009, 11:50
von jbs
Das sind natürlich Informationen, die man der Welt nicht vorenthalten sollte.

Ich glaube das sollte helfen:
http://bottle.paws.de/page/docs#apache-mod_wsgi

konkret:

Code: Alles auswählen

os.chdir(os.path.dirname(__FILE__))

Verfasst: Samstag 17. Oktober 2009, 13:04
von MikeScript
Ok. Nun findet er es.
Mal eine allgemeinere Frage:
Ist das der übliche Weg, wenn man eine Webseite programmiert und verschiedene Module einbinden möchte, die alle in Unterverzeichnissen liegen?

Verfasst: Samstag 17. Oktober 2009, 13:23
von Defnull
MikeScript hat geschrieben:Ok. Nun findet er es.
Mal eine allgemeinere Frage:
Ist das der übliche Weg, wenn man eine Webseite programmiert und verschiedene Module einbinden möchte, die alle in Unterverzeichnissen liegen?
Python sucht zu erst im aktuellen Verzeichnis und dann im Suchpfad (sys.path) nach Modulen. Apache hat aber ein anderes 'aktuelles Verzeichnis' als es dein Python Skript hätte, würdest du es direkt aus führen. Daher musst du entweder mit os.cwd() den Pfad an passen oder das Verzeichnis deiner Modul-Bibliothek in sys.path einfügen.

Der 'übliche Weg' wäre, deine Module in ein Server weit erreichbaren Suchpfad zu installieren. Dann hättest du das Problem nicht. Alternativ gibt es da auch noch die PYTHONPATH Umgebungsvariable.

Egal, wie du es machst, irgendwie musst du Python halt erzählen, wo er suchen soll.

Verfasst: Samstag 17. Oktober 2009, 13:25
von nemomuk
Meine Version hätte wohl eher so lauten sollen:

Code: Alles auswählen

import sys 
sys.path.insert(0, os.path.dirname(__file__))