2009-07-20 31 views
2

Ich erstelle Python-Dateien im Verlauf der Ausführung eines Python-Programms. Ich möchte dann diese Dateien importieren und Funktionen ausführen, die in ihnen definiert wurden. Die Dateien, die ich erstelle, werden nicht in meinen Pfadvariablen gespeichert und ich würde es lieber so behalten.Dynamisch erstellte Python-Dateien importieren

Ursprünglich habe ich die execFile(<script_path>) Funktion aufgerufen und dann die durch Ausführen der Datei definierte Funktion aufgerufen. Dies hat als Nebeneffekt immer den if __name__ == "__main__" Zustand, den ich mit meinem jetzigen Setup nicht haben kann.

Ich kann die generierten Dateien nicht ändern, weil ich bereits 100 von ihnen erstellt habe und sie nicht alle überarbeiten möchte. Ich kann nur die Datei ändern, die die generierten Dateien aufruft.

Im Grunde, was ich habe jetzt ...

#<c:\File.py> 
def func(word): 
    print word 

if __name__ == "__main__": 
    print "must only be called from command line" 
    #results in an error when called from CallingFunction.py 
    input = sys.argv[1] 

#<CallingFunction.py> 
#results in Main Condition being called 
execFile("c:\\File.py") 
func("hello world") 
+3

Ohne Bezug: Verwenden Sie niemals Backslashes für Dateinamen im Code. Schreibe "c: /file.py"; Es funktioniert in Windows und ist viel konsistenter für alles, was Pfade analysiert. –

Antwort

5

Verwenden

m = __import__("File") 

Dies ist im Wesentlichen der gleiche wie zu tun

import File 
m = File 
+0

Es ist in der Tat das Gleiche und löst Halfcent's Problem nicht, wenn ich richtig lese, dass seine "Dateien, die ich erstelle, nicht in meinen Pfadvariablen gespeichert sind, und ich würde es lieber so behalten". –

+0

Oder ignorieren Sie einfach die nicht hilfreiche Einschränkung. Die Dateien können in ein Unterpaket eingefügt werden, das den anderen Modulen im Root-Paket Ihres Projekts nicht im Wege steht. – habnabit

3

Wenn ich richtig Ihre Bemerkungen zu verstehen, dass ein Mann Die Datei ist nicht in sys.path und Sie würden es lieber so behalten, das würde immer noch funktionieren:

import imp 

fileobj, pathname, description = imp.find_module('thefile', 'c:/') 
moduleobj = imp.load_module('thefile', fileobj, pathname, description) 
fileobj.close() 

(Natürlich gegeben 'c: /thefile.py' können Sie die 'C: /' Teile extrahieren und 'thefile.py' mit os.path.spliy, und von 'thefile.py' get ‚thefile 'mit os.path.splitext.)

Verwandte Themen