2012-04-10 1 views
1

Ich muss alle Python-Module in einem angegebenen Verzeichnis neu laden.Alle Module in einem Verzeichnis neu laden

Ich habe so etwas wie dies versucht:

import sys, os 
import_folder = "C:\\myFolder" 
sys.path.insert(0 , import_folder) 
for dir in os.listdir(import_folder): 
    name = os.path.splitext(dir)[0] 
    ext = os.path.splitext(dir)[1] 
    if ext == ".py": 
     import(eval(name)) 
     reload(eval(name)) 

Wer weiß, wie dies richtig zu tun?

+4

"Ich muss alle Python-Module in einem angegebenen Verzeichnis neu laden." - Warum? –

+0

Ein Fall, in dem jemand alle Module im Verzeichnis neu laden möchte, ist möglicherweise, wenn die Ausgabe zeitabhängig ist. Wenn beispielsweise das Programm die Daten aus der Datenbank holt, die regelmäßig aktualisiert werden und Benutzermodule nicht miteinander verknüpft sind, kann es nützlich sein, alle Module in einem bestimmten Verzeichnis neu zu laden. –

+1

@Jack_of_All_Trades: Da gibt es wahrscheinlich eine bessere Lösung für das OP-Problem, also müssen wir wissen, was dieses Problem eigentlich ist. Übrigens, ich verstehe den von Ihnen beschriebenen Anwendungsfall nicht. –

Antwort

0
import os # we use os.path.join, os.path.basename 
import sys # we use sys.path 
import glob # we use glob.glob 
import importlib # we use importlib.import_module 

import_folder = 'C:\\myFolder' 
sys.path.append(import_folder) # this tells python to look in `import_folder` for imports 
for src_file in glob.glob(os.path.join(import_folder, '*.py')): 
    name = os.path.basename(src_file)[:-3] 
    importlib.import_module(name) 
    reload(sys.modules[name]) 
    importlib.import_module(name) 

Da ist der Code. Nun zur Semantik der ganzen Sache: Mit importlib wird das ein bisschen normaler, aber es fördert immer noch einige Bugs. Sie können sehen, dass dies für Quelldateien in einem Unterverzeichnis bricht. Was sollten Sie wahrscheinlich tun ist: Importieren Sie das Paket, (importieren den gesamten Ordner), und verwenden Sie den . Operator wie folgt:

import sys # we use sys.path 
sys.path.append('C:\\') 
import myFolder 
... 
myFolder.func1(foo) 
myFolder.val 
bar = myFolder.Class1() 

Vielleicht sollten Sie am documentation for modules einen Blick darauf werfen, aber vergessen Sie nicht, zu aktualisieren Der Pfad zum übergeordneten Element des Ordners, den Sie importieren möchten.