Datei mit String als Name importieren [duplizieren]

8

Ich beabsichtige, bald eine Reihe von Dateien zu erstellen, und die beste Art, sie zu organisieren, ist eine Liste zu haben, diese Liste wird ganz oben in einer Datei stehen, und danach wird es eine lächerliche Menge davon geben Code, um zu behandeln, was diese Liste steuert und wie sie funktioniert. Ich möchte die Liste nur einmal schreiben, und die Liste ist eine Liste von Ordner- und Dateinamen in diesem Format:

%Vor%

Wie Sie sehen können, sind folder/filename gleich (eine Art). Dateiname ist der Ordnername mit .py am Ende, aber beim Importieren von XXX musst du XXX.py nicht importieren, daher sehe ich kein Problem.

Das Problem, mit dem ich konfrontiert bin, importiert mit dieser Methode ...

%Vor%

Also für jeden Test, den ich habe, den Namen ausdrucken, einen String zusammenstellen, der den Pfad enthält ( "\testName" ), für dieses Beispiel den Testpfad ausdrucken, dann den Pfad zur Liste hinzufügen ( sys.path.append(path) ), dann Drucken Sie, um zu bestätigen, dass es passierte, dann stellen Sie eine Zeichenkette zusammen, die von eval für das Hauptmodul der Tests ausgeführt wird und schließlich es prüft.

Wie Sie sehen können, muss ich momentan eine Liste von Importen an der Spitze haben. Ich kann nicht einfach importieren testName (der Inhalt von testName ist der Name des Moduls, das ich importieren möchte), da es versuchen wird, ein Modul namens testName zu finden, nicht ein Modul namens Inhalt von testName .

Ich habe ein paar Beispiele gesehen, wo das gemacht wurde, aber ich finde keine, die unter meinen Umständen funktionieren. Wenn jemand im wahrsten Sinne des Wortes einen Code schreiben könnte, wäre das wunderbar.

Ich würde auch verlangen, dass ich nicht aufgehängt, gezeichnet oder geviertelt werde, um eval zu verwenden. Es wird in einer sehr kontrollierten Umgebung verwendet (die Liste, durch die es sich zyklisch innerhalb der .py-Datei befindet, also kein Ende Benutzer "sollte sich damit anlegen).

    
XtrmJosh 28.12.2012, 14:38
quelle

3 Antworten

24

Ich bin mir nicht sicher, ob ich alles richtig verstanden habe, aber Sie können ein Modul dynamisch mit __import__ importieren:

%Vor%

Bearbeiten : Ich war mir nicht bewusst, dass die Verwendung von __import__ von den Python-Dokumenten für den Benutzercode nicht empfohlen wurde: __import__ Dokumentation (wie von Bakuriu festgestellt)

Dies sollte auch funktionieren und wäre besser Stil:

%Vor%     
lbonn 28.12.2012, 14:45
quelle
16
  1. Niemals jemals mit sys.modules direkt fertig werden, wenn Sie nicht genau wissen, was Sie tun.
  2. Es gibt viele Möglichkeiten, das zu tun, was Sie wollen:
    1. Die integrierte Funktion __import__
    2. Verwenden Sie imp.load_module
    3. Verwenden von importlib.import_module

Ich würde es vermeiden, __import__ direkt zu verwenden und gehe zu importlib.import_module (was auch am Ende der Dokumentation von __import__ vorgeschlagen wird).

    
Bakuriu 28.12.2012 14:47
quelle
0

Fügen Sie den Pfad, in dem sich das Modul befindet, zu sys.path hinzu. Importieren Sie das Modul mithilfe der Funktion __import__, die eine Zeichenfolgenvariable als Modulname akzeptiert.

%Vor%     
Swapnil 28.12.2012 14:55
quelle

Tags und Links