Python sys.modules enthält ein Modul, das noch nicht importiert wurde

8

Ich versuche den Unterschied zwischen einem geladenen Modul und einem importierten Modul zu verstehen, falls es welche gibt.

Ich arbeite in Python 2.7.3 und führe gerade Python von der Kommandozeile aus.

Wenn ich folgendes ausführe:

%Vor%

Ich bekomme eine Liste, die zum Beispiel os enthält. Die Dokumentation besagt, dass sys.modules eine Liste von "geladenen" Modulen ist. Wenn ich jedoch versuche, etwas wie os.environ auszuführen, bekomme ich einen NameError, der mir sagt, dass os nicht definiert ist. Wenn ich dann import os ausführen, behebt dies das Problem. Kann jemand erklären, warum os in sys.modules existiert, bevor ich das Modul tatsächlich importiere?

    
Justin 28.07.2012, 02:00
quelle

1 Antwort

9

Der Unterschied zwischen einem Modul, das importiert und geladen wird, ist, was in den Namespace Ihres aktuellen Moduls eingefügt wird. Ein Modul wird nur einmal geladen (in normalen Situationen), kann aber viele Male von vielen verschiedenen Orten importiert werden. Auf ein geladenes Modul darf in einem bestimmten Namespace nicht zugegriffen werden, wenn es dort nicht importiert wurde. Zum Beispiel können Sie ein Modul laden, ohne es unter seinem Namen mit der from module import name -Syntax zu importieren (Sie können auf den angegebenen Namen zugreifen, aber nicht auf das Modul selbst).

Sie sehen das os -Modul im sys.modules -Wörterbuch, da es intern vom Python-Interpreter verwendet wird und daher immer beim Start geladen wird. Sie können jedoch nicht mit dem Namen "os" darauf zugreifen, da er nicht automatisch in Ihren Namespace importiert wird.

Sie können jedoch die normalen Importmechanismen auf verschiedene Arten umgehen. Versuchen Sie es zum Beispiel:

%Vor%

Sie können jetzt auf das Modul os zugreifen, als ob Sie import os erledigt hätten.

Das liegt daran, dass dieser Code genau das ist, was eine import -Anweisung tut, wenn Sie ein Modul anfordern, das bereits geladen wurde. Wenn Sie jedoch den obigen Code mit einem Modul versuchen, das noch nicht geladen ist, wird es nicht funktionieren (Sie erhalten einen Schlüsselfehler vom sys.modules Wörterbuch). Die Anweisung import lädt neue Module und fügt sie zusätzlich zum aktuellen Namespace hinzu. Während Sie Module manuell laden und das reguläre Importsystem weiter bearbeiten können, gibt es selten einen guten Grund dafür.

    
Blckknght 28.07.2012, 03:14
quelle

Tags und Links