Import bei WSGI

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
MikeScript
User
Beiträge: 10
Registriert: Montag 21. September 2009, 19:24

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
MikeScript
User
Beiträge: 10
Registriert: Montag 21. September 2009, 19:24

Ja sind im gleichen Ordner, wie gezeigt.

Und wie wäre es relativ möglich?

Nun ist der Fehler:
"ImportError: No module named primzahl"
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Die Datei muss natürlich dann auch primzahl.py und nicht Primzahl.py heissen...
Bottle: Micro Web Framework + Development Blog
MikeScript
User
Beiträge: 10
Registriert: Montag 21. September 2009, 19:24

Das tut sie natürlich ;) So kleine Fehler unterlaufen mir nur selten :P
Habs all-lowercase gemacht wie in PEP8 beschrieben.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
MikeScript
User
Beiträge: 10
Registriert: Montag 21. September 2009, 19:24

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
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Was hat die __init__.py damit zu tun, wenn ich im gleichen Verzeichnis ein import primzahl mache?
BlackJack

@ScheiderWeisse: Gar nichts. Aber wenn man ein ``from . import primzahl`` macht, dann eine ganze Menge.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Naja, wobei das doch hier gar nicht notwendig ist? Was stört euch an einem einfachen "import primzahl"?
MikeScript
User
Beiträge: 10
Registriert: Montag 21. September 2009, 19:24

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
MikeScript
User
Beiträge: 10
Registriert: Montag 21. September 2009, 19:24

Den Binärcode habe ich schon mehrfach gelöscht und Apache auch neu gestartet, Browsercache geleert etc.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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__))
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
MikeScript
User
Beiträge: 10
Registriert: Montag 21. September 2009, 19:24

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?
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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.
Bottle: Micro Web Framework + Development Blog
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Meine Version hätte wohl eher so lauten sollen:

Code: Alles auswählen

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