102 votes

Comment importer un module en Python avec importlib.import_module

J'essaie d'utiliser importlib.import_module dans Python 2.7.2 et rencontrent l'étrange erreur suivante.

Considérons la structure dir suivante :

    a
    |
    + - \_\_init\_\_.py
      - b
        |
        + - \_\_init\_\_.py
          - c.py

a/b/__init__.py a le code suivant :

    import importlib

    mod = importlib.import\_module("c")

(En code réel "c" a un nom).

Essayer de import a.b donne l'erreur suivante :

    >>> import a.b
    Traceback (most recent call last):
      File "", line 1, in 
      File "a/b/\_\_init\_\_.py", line 3, in 
        mod = importlib.import\_module("c")
      File "/opt/Python-2.7.2/lib/python2.7/importlib/\_\_init\_\_.py", line 37, in   import\_module
        \_\_import\_\_(name)
    ImportError: No module named c

Qu'est-ce que je rate ?

Gracias.

125voto

Cat Plus Plus Points 53385

Pour les importations relatives, vous devez :

  • a) utiliser le nom relatif
  • b) fournir une ancre de manière explicite

    importlib.import_module('.c', 'a.b')

Bien sûr, vous pourriez aussi faire une importation absolue à la place :

importlib.import_module('a.b.c')

40voto

Gerald Points 355

Je pense que c'est mieux d'utiliser importlib.import_module('.c', __name__) puisque vous n'avez pas besoin de savoir a y b .

Je me demande également si, si vous devez utiliser importlib.import_module('a.b.c') pourquoi ne pas simplement utiliser import a.b.c ?

22voto

H.Sechier Points 81

Et n'oubliez pas de créer un __init__.py avec chaque dossier/sous-dossier (même s'ils sont vides)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X