2 Stimmen

Kann __import__() nicht dazu bringen, ein Modul in Python dynamisch zu importieren - ich weiß das, weil es nicht in sys.modules auftaucht

Ich habe ein kleines Skript geschrieben. Es soll das Python-Verzeichnis nach allen verfügbaren Modulen durchsuchen (unabhängig davon, ob sie installiert sind oder nicht), dann soll es prüfen, welche Module derzeit geladen sind, und dann bietet es eine Option zum dynamischen Laden eines Moduls Ihrer Wahl an. Letzteres mit __import__() weil ich eine Zeichenkette übergebe - (hier habe ich ein Problem - aber ich komme gleich darauf zurück)... dann gibt es die Möglichkeit, das Modul nach all seinen Klassen, Funktionen usw. zu "durchsuchen" (mit dir([module name]) ...).

Das Problem:

Wenn das Modul dynamisch geladen wird - es ist eingebettet in eine try/except Anweisung - wenn sie erfolgreich ist, meldet sie, dass das "Modul geladen" ist, und wenn sie fehlschlägt, meldet sie ... "Failed to load...".

Wenn Sie den Namen eines Moduls eingeben, z. B. ein Modul mit dem Namen "uu", wird "geladen" angezeigt. Ich weiß also, dass es geladen wird. Wenn ich jedoch zurück gehe und die Funktion aufrufe, die alle geladenen Module überprüft, ist sie leer (mit sys.modules )

Ich denke, dass Python das Modul an einen temporären Ort lädt, der nicht sys.modules denn wenn ich das Skript verlasse und die sys.modules sie ist nicht vorhanden.

1voto

unutbu Punkte 769083

Nascent_Notes, schönes Skript! Ich habe versucht zu laden uu (Befehl 3) und das Drucken der Liste der geladenen Module (Befehl 2) und beides scheint gut zu funktionieren.

Wenn ich jedoch versuche, das Modul zu durchsuchen (Befehl 4), erhalte ich die folgende Fehlermeldung:

HlpWiz>>> 4
What module do you want to look more into?:  uu

*An error occurred - probably because the module isn't loaded or is misspelled*

Versuchen Sie zu laufen

#!/usr/bin/env python
import sys
__import__('uu')
print(sys.modules['uu'])
print(dir(uu))

Sie sollten sich NameError: name 'uu' is not defined .

Es scheint also, dass, obwohl __import__ importiert erfolgreich die uu Modul, es fügt keine uu in den globalen Namespace - das Modul uu kann nicht sein über den Variablennamen zugegriffen werden uu . Der Zugriff ist möglich über sys.modules aber:

Deshalb ändern

    var_mod = input("What module do you want to look more into?:  ")
    print "\n attempting to browse... please wait!"
    time.sleep(2)
    browse_mod(zlib = var_mod)

zu

    var_mod = raw_input("What module do you want to look more into?:  ")
    print "\n attempting to browse... please wait!"
    time.sleep(2)
    browse_mod(zlib = sys.modules[var_mod])

Es ist nicht nur die Verwendung raw_input viel sicherer als input (der Benutzer kann keine unerwarteten/schädlichen Befehle ausführen), aber auch raw_input macht, was Sie hier wollen.

Eine kleine Anmerkung am Rande: Sie könnten auch Folgendes ändern

i = 1
for line in sample:
    print i, line
    i = i + 1

zum eher pythonischen

for i,line in enumerate(sample):
    print i+1, line

Editar :

sys.modules ist ein Diktat (kurz für Wörterbuch). Dictes sind wie Telefonbücher - man gibt einen Namen ein (besser bekannt als "Schlüssel") und es gibt eine Telefonnummer zurück (oder allgemeiner einen "Wert").

Im Fall von sys.modules sind die Schlüssel Modulnamen (Strings). Die Werte sind die Modulobjekte selbst.

Sie greifen auf die Werte im Diktat über die Klammerschreibweise zu. Also uu ist nur eine Zeichenkette, aber sys.modules['uu'] ist das Modul uu .

Den vollständigen Bericht über dicts können Sie hier lesen: http://docs.python.org/tutorial/datastructures.html#dictionaries

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X