2016-06-30 3 views
3

J'ai donc essayé de créer un programme simple qui va importer dynamiquement des modules dans un dossier avec un certain nom. Je cd avec os dans le répertoire et je cours module = __import__(module_name) car je suis dans une boucle for avec tous les noms de fichiers décrits étant itérés dans la variable nom_module.L'importation dynamique de modules aboutit à un ImportError

Mon seul problème est que je me fais frapper avec:

ImportError: No module named "module_name" 

(en disant le nom de la variable que j'ai donné comme une chaîne). Le fichier existe, il est dans le répertoire mentionné et import fonctionne très bien dans le même répertoire. Mais une importation normale normale ne fonctionne pas pour les modules du répertoire cd. Le code ressemble à ceci. Je suis désolé si c'est une question évidente.

import os 

class Book(): 
    def __init__(self): 
     self.name = "Book of Imps" 
     self.moduleNames = [] 

    # configure path 
    def initialize(self): 
     path = os.getcwd() + '/Imp-pit' 
     os.chdir(path) 
     cwd = os.walk(os.getcwd()) 
     x, y, z = next(cwd) 
     # Build Modules 
     for name in z: 
      if name[:3] == 'Imp': 
       module_name = name[:len(name) - 3] 
       module = __import__(module_name) 

def start_sim(): 
    s = Book() 
    s.initialize() 

if __name__ == '__main__': 
    start_sim() 

Répondre

1

Je ne pense pas que l'interprète modifie dynamiquement sys.path si vous changez simplement le répertoire en cours avec os.chdir. Vous devrez manuellement insérer la variable path dans la liste sys.path pour que cela fonctionne, i.e.:

sys.path.insert(0, path) 

Python recherche généralement sys.path lors de la recherche des modules, il trouverez si vous spécifiez là.

Une note supplémentaire; n'utilisez pas __import__, utilisez plutôt importlib.import_module. L'interface est exactement la même, mais la seconde est généralement conseillé dans le documentation.

0

Vous devez utiliser le try-except concept, .: par exemple

try: 
    import csv    
except ImportError: 
    raise ImportError('<error message>') 

Si je ne vous comprends juste, alors

try: 
    module = __import__(module_name) 
except ImportError: 
    raise ImportError('<error message>')