Importierte Module werden beim Ausführen einer Funktion zu None

8

Update : Weitere Informationen zum Debuggen finden Sie am Ende dieses Beitrags, die etwas sehr Verworrenes im Python-Zustand ergeben.

Ich habe ein Modul, das unter anderem das django User-Objekt importiert.

Der Import funktioniert einwandfrei und der Code wird geladen. Wenn Sie jedoch eine Funktion in dem Modul aufrufen, das das Benutzerobjekt verwendet, wird der Benutzer als NoneType angezeigt.

Es gibt auch eine Reihe anderer Importe und einige globale Variablen auf Modulebene, die zum Zeitpunkt des Aufrufs der Funktion ebenfalls Keine sind.

Seltsamerweise ist das nur ein Problem in unseren Staging-Umgebungen (Ubuntu 12.04). Es funktioniert gut lokal, was am ehesten dem Staging mit zusätzlichen Python-Paketen für die Entwicklung ähnelt. Auch gut in der Produktion.

Hat jemand schon mal darüber gestolpert und hat irgendwelche Ideen, was das verursachen könnte?

Hier ist der Code:

%Vor%

und hier ist die Arbeit um, was bedeutet, dass Sie das, was Sie brauchen, wieder in die Funktion importieren:

%Vor%

Hier ist der Stack-Trace. Der Fehler wird durch die Zeile verursacht:

%Vor%

in der Funktion generate_random_codes.

%Vor%

Aktualisieren : Es ist nicht nur etwas, das das Benutzerobjekt löscht - etwas ruiniert den gesamten Kontext der Funktion.

%Vor%

Bei diesen print-Anweisungen lautet die Ausgabe:

%Vor%

Beachten Sie, dass sowohl __package__ als auch __name__ undefiniert sind, was ich für ziemlich unmöglich hielt und dass die sys.modules Version des Moduls eine korrekte __dict__ hat, der Rückgabewert von globals() ist Unsinn.

    
Stuart Marsh 13.06.2013, 10:01
quelle

1 Antwort

7

Das passiert mit einer Funktion in einem importierten Modul, die immer noch ausgeführt wird, nachdem das Modul "Garbage Collected" ist.

Da Ihr Code nicht ausreicht, um das Problem zu reproduzieren, finden Sie hier ein vereinfachtes Beispiel, das das Verhalten zeigt. Erstellen Sie eine Datei, die Folgendes enthält, und importieren Sie sie entweder von der Python-Befehlszeile oder aus einer anderen Datei. Es funktioniert nicht, wenn Sie es einfach ausführen auf der obersten Ebene.

%Vor%

Ausführen:

%Vor%

Beim Herunterfahren von Python werden die Module auf None gesetzt. Dies ist ein obskures Python-Verhalten, das in 3.4 entfernt wurde . In diesem Beispiel führt das Beenden des Hauptthreads zum Herunterfahren, aber der andere Thread wird noch ausgeführt, sodass die Module als None angezeigt werden.

Es gibt ein einfacheres Beispiel von hier , was dasselbe tut, indem die Modulreferenz direkt von sys.modules gelöscht wird.

%Vor%     
Ben C 08.07.2013 16:18
quelle

Tags und Links