2012-12-28 15 views
8

Mögliche Duplizieren:
Dynamic module import in PythonImport-Datei mit Zeichenfolge als Name

Ich beabsichtige, bald eine Reihe von Dateien zu einem bestimmten Zeitpunkt zu machen, und der beste Weg, es zu organisieren, zu haben ist eine Liste, diese Liste wird ganz oben in einer Datei stehen, und danach wird eine lächerliche Menge an Code kommen, um zu handhaben, was diese Liste steuert und wie sie funktioniert. Ich bin auf der Suche auf die Liste schreiben nur einmal, und die Liste eine Liste der Ordner- und Dateinamen in diesem Format ist:

[(folder/filename, bool, bool, int), (folder/filename, bool, bool, int)] 

Wie Sie sehen können, folder/filename gleich sind (Art). Dateiname ist der Ordnername mit .py am Ende, aber wenn Sie XXX importieren, müssen Sie XXX.py nicht importieren, daher sehe ich kein Problem.

Das Problem, das ich bin Bewurf ist mit dieser Methode importieren ...

for (testName, auto, hardware, bit) in testList: 
    print(testName) 
    paths = "\\" + testName 
    print paths 
    addpath(paths) 
    sys.modules[testName] = testName # One of a few options I've seen suggested on the net 
    print("Path Added") 
    test = testName + ".Helloworld()" 
    eval(test) 

den Namen also für jeden Test, den ich habe, drucken, ein String zusammenstellen, das den Pfad enthält ("\\testName"), für dieses Beispiel , drucke den Testpfad, füge dann den Pfad zur Liste hinzu (sys.path.append(path)), drucke dann, um zu bestätigen, dass es passiert ist, dann füge einen String zusammen, der von eval für das Hauptmodul des Tests ausgeführt wird und schließlich prüft.

Wie Sie sehen können, muss ich derzeit eine Liste von Importen an der Spitze haben. Ich kann nicht einfach testName importieren (der Inhalt von testName ist der Name des Moduls, das ich importieren möchte), da es versuchen wird, ein Modul namens testName zu finden, kein Modul mit dem Inhalt 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 zyklisch ist innerhalb der .py-Datei, also nicht ") Endbenutzer "sollte sich damit anlegen).

+0

Beachten Sie, dass die Vertiefung in ST korrekt ist, aus irgendeinem Grund denke ich, diese Seite einfach nicht mein Text richtig mag das Parsen :( – XtrmJosh

+1

nicht Tabs aber Leerzeichen für die Einrückung Sie. –

+2

Python hat bereits einen Weg B. das Verwalten umfangreicher Sammlungen von '.py'-Dateien, die Sie möglicherweise importieren möchten, die Kenntnis von Ordnern und Unterordnern, die Handhabung relativer Imports, das korrekte Namespacing usw. Es wird als [Paket] (http: // docs. python.org/2/tutorial/modules.html#packages) Gibt es einen Grund, warum du keinen verwenden willst? – katrielalex

Antwort

24

nicht sicher, ob ich alles richtig verstanden, aber man kann ein Modul dynamisch __import__ mit importieren:

mod = __import__(testName) 
mod.HelloWorld() 

bearbeiten: Ich war nicht bewusst, dass die Verwendung von __import__ durch den Python-docs entmutigt wurde Benutzercode: __import__ documentation (wie durch Bakuriu angegeben)

Dies auch funktionieren sollte und würde besser Stil in Betracht gezogen werden:

mod = importlib.import_module(testName) 
mod.HelloWorld() 
+0

Wunderbar, danke eine Tonne dafür, verbrachte gut über eine Stunde, um Informationen darüber zu suchen, ich habe früher __import __ (testName) geschrieben, aber nicht bemerkt, dass ich die Antwort einem Modul oder uns zuweisen musste, glücklicherweise werden alle meine Funktionen in allen Dateien Test genannt, also kann ich einfach mod.Test() aufrufen jetzt an. – XtrmJosh

+0

@XtrmJosh hast du die andere Antwort gesehen? '__import__' ist ein Implementierungsdetail; Sie sollten 'importlib' (oder' imp' verwenden, wenn Ihnen Python 3.x-Kompatibilität egal ist). – katrielalex

16
  1. Nie, jemals, jemals mit sys.modules direkt durcheinander bringen, wenn Sie nicht genau wissen, was Sie tun.
  2. viele Möglichkeiten gibt es zu tun, was Sie wollen:
    1. Die build-in __import__ Funktion
    2. imp.load_module Mit
    3. Mit importlib.import_module

ich vermeiden würde mit __import__ direkt, und gehen Sie für importlib.import_module (die auch am Ende der Dokumentation vonvorgeschlagen wird).

+1

Dies ist für 'import moduleName', wobei moduleName die Zeichenfolge ist. Wie wäre es mit 'von Modulname importieren *'? –

+2

@NamGVU versuchen, das Modul wie oben zu importieren und dann: 'globals(). Update (Modul .__ dict __)' – Bakuriu

+0

Arbeiten wie ein Charme. Vielen Dank! –

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.

import sys 
sys.path.insert(0, mypath) # mypath = path of module to be imported 
imported_module = __import__("string_module_name") # __import__ accepts string 
imported_module.myfunction() # All symbols in mymodule are now available normally 
Verwandte Themen