import ok, modul aber nicht da

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
deets

Hallo,

ich habe einen Fehler, den ich mir so auf Anhieb nicht erklaeren kann.

Folgender Code schlaegt fehl mit einem "AttributeError: module object has no attribute submodule":

Code: Alles auswählen

import base.submodule
# das verhalten ist so, als ob folgende Zeile einkommentiert waere
# del base.submodule 
base.submodule.setup_all()
Das oben ist natuerlich paraphrasiert. Ein bisschen noch zum Kontext: das ganze passiert in einem mod_wsig-Application-Skript, mod_wsgi benutzt Daemon-Prozesse. Beim Start gibt es einen Fehler in "setup_all" - so weit, so gut.

Komischerweise versucht er dann, andere worker-daemons zu spawnen, und die haben dann das submodule schon gar nicht mehr zur Verfuegung. Die brechen dann weg mit obiger Fehlermeldung.

Darum die Frage: wie bringt man den Python-Interpreter in einen Zustand, in dem er ein Modul als importiert betrachtet (also import a.b durchlaeuft), aber kein Modulobjekt dahinter steckt? Normalerweise haette ich da an Nebenlaeufigkeit gedacht, aber erstens haben wir keine Threads, und zweitens gibt's ja auch ein import-lock.

Irgendwelche Ideen?
lunar

@deets: Pauschal gesagt tritt dieser Fehler immer dann auf, wenn "base.submodule" in "sys.modules" existiert (dann nämlich ist der Import erfolgreich), aber "submodule" nicht im Namensraum von "base". Der Interpreter setzt dieses Attribut nur beim ersten Import des Moduls über das Paket. Bei folgenden Imports greift der Interpreter auf "sys.modules" zu. Pakete und Module sind mithin eine Art superglobaler Zustand, die Ursache für diesen Fehler kann also überall liegen, auch beispielsweise im C-Code von mod_wsgi.

Soweit zur allgemeinen Natur dieses Fehlers. Im Bezug auf Dein spezielles Problem ist das natürlich wenig hilfreich, aber ich fürchte, Du hast die Problembeschreibung etwas zu sehr abstrahiert, als dass man direkt konkrete Hinweise geben könnte.
deets

@lunar

Ja, soweit hatte ich mir das auch schon gedacht. Und mir ist auch klar, dass es keine konkreten Hinweise geben kann bei dem bisschen Code. Ich dachte, vielleicht hat jemand - durchaus auch unter voellig anderen Umstaenden - schonmal etwas aehnliches erlebt, und kann das beschreiben. Dann haette ich Anhaltspunkte.

Ich habe auch schon in Richtung C-Extensions gedacht, aber das waere verwunderlich, weil bei dem code der da wirklich laeuft keine C-extension im Spiel ist (zumindest keine, die nicht Standard waere, cPickle zB).

Eine Ueberlegung war, ob mod_wsgi aus irgendwelchen Gruenden einen Interpreter forked fuer seine Daemon-Prozesse, der schon teil-instanziiert ist. Aber das ist alles sehr, sehr spekulativ.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Also ich habe des öfteren schon den Fehler gemacht mein script genauso zu benennen wie einen der Imports den ich mache...

Also random.py mit inhalt:

Code: Alles auswählen

import random
random.randint()
Gibt bei mir auch

Code: Alles auswählen

AttributeError: 'module' object has no attribute 'randint'
Steinigt mich ruhig wenn meine Antwort mal wieder nicht zur Frage passt xD
deets

@JonasR

Gerne, ich such nur gerade mal nach ein paar netten Kieseln....

Der Grund, warum das irrelevant ist: dein Beispiel bezieht sich darauf, dass einem Modul ein Attribut fehlt. zB durch eine ueberschatten mit einem Modul gleichen Namens, wie es dir passiert.

Mein Beispiel bezieht sich darauf, dass ein *package*, dass definitiv ein unter-modul hat, mit einem mal dieses Untermodul "verliert". Bzw. Python denkt, es muss das nicht mehr importieren, weil es ja schon in sys.modules drin steckt.

Ich werfe aber nur kleine Kiesel, weil es von der Fehlermeldung her schon in die richtige Richtung geht...
Antworten