112 votes

Module n'a pas d'attribut

J'ai un répertoire avec un certain nombre de fichiers .py. Chaque fichier définit certaines classes. J'ai également un __init__.py vide dans le répertoire.

Par exemple :

monprojet
    __init__.py
    monmodule
        __init__.py
        api.py
        models.py
        views.py

J'essaie d'importer monmodule et d'accéder aux classes définies dans tous ces fichiers :

from myproject import mymodule

print mymodule.api.MyClass 

Il me donne une erreur disant que monmodule n'a pas d'attribut api. Pourquoi? Et pourquoi je peux accéder à seulement un des fichiers (models.py) et pas aux autres?

In [2]: dir(banners)
Out[2]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '__path__',
 'models']

119voto

Rob Wouters Points 6654

Le problème est que les sous-modules ne sont pas importés automatiquement. Vous devez importer explicitement le module api :

import myproject.mymodule.api
print myproject.mymodule.api.MyClass

Si vous insistez vraiment sur le fait que api soit disponible lors de l'importation de myproject.mymodule, vous pouvez mettre ceci dans myproject/mymodule/__init__.py :

import myproject.mymodule.api

Alors cela fonctionnera comme prévu :

from myproject import mymodule

print mymodule.api.MyClass

43voto

Olaf Points 129

Vérifiez également si vous n'avez pas nommé votre fichier python de la même manière que le module que vous essayez d'importer.

2voto

Daniel Roseman Points 199743

Les modules ne fonctionnent pas de cette manière.

from myproject.mymodule import api
print api.MyClass

-5voto

Akash Points 265

Vous avez besoin d'un __init__.py dans le répertoire de mon projet aussi. Ainsi, la structure de votre module doit être :

monprojet
    __init__.py
    monmodule
        __init__.py
        api.py
        models.py
        views.py

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