2010-02-18 17 views
1

J'ai posé une question similaire hier, mais j'ai acquis un problème vraiment étrange depuis lors. Avec cette structure de répertoire:python plus de problèmes d'importation de modules

app/ 
    models/ 
     __init__.py 
     user.py 
     other.py 
    pages/ 
     __init__.py 
     pages.py 

Les modèles/__ fichier init__.py a cette ligne:

__all__ = ['user', 'other'] 

et les pages/__ init__.py a

__all__ = ['pages'] 

En pages.py, Pour utiliser l'une des classes dans user.py ou other.py, je dois avoir

from models import * 
import models 

en haut, et je peux déclarer une classe User comme ceci:

my_user = models.user.User() 

Si j'exclus ou l'autre des déclarations-ment importation en haut, je reçois des erreurs comme

"Class user has no attribute User" 

Tous l'aide serait appréciée. J'adore Python, mais j'aimerais que sa fonctionnalité d'importation fonctionne plus comme celle de PHP.

+3

C'est la première fois que j'entends quelqu'un dire qu'il aimerait que Python fonctionne comme PHP ... – voyager

+0

ha, oui c'est la première fois que je l'ai dit aussi ... –

Répondre

2

Il y a deux options, selon l'endroit où vous voulez être explicite et combien vous voulez disponibles « par défaut » (ce qui signifie également forcé).

Dans ces fichiers __init__, vous pouvez utiliser:

# models/__init__.py shown: 
import user, other     # ambiguous relative import 
from . import user, other   # relative import 
from app.models import user, other # absolute import 

Ou, où que vous auriez juste import models, utilisez:

from models import user, other 
# or: 
import models.user, models.other 

Cette dernière forme est plus largement préférée.

+0

je mets 'depuis app.models import user, other' et ça marche super, merci –

0
import models.user 
1

Une chose qui peut être réel utile lorsque vous python d'apprentissage (ou le débogage), est d'exécuter de façon interactive et utiliser la fonction dir() pour voir ce qui vit où:

>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__'] 
>>> import models 
>>> dir(models) 
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 
>>> models.user 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'user' 
>>> from models import * 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'models', 'other', 'user'] 
>>> dir(models) 
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__','__path__', 'other', 'user'] 
>>> user 
<module 'models.user' from 'C:\test\models\user.py'> 
>>> models.user 
<module 'models.user' from 'C:\test\models\user.py'> 
>>> user.User 
<class 'models.user.User'> 

Mise à jour: sortie fixe .

+0

Quel est le contenu de vos modèles/\ _ \ _ init \ _ \ _. py? Comme l'indique la question, «importer des modèles; models.user' donnera une AttributeError. (Est-ce que votre exemple a 'import user' dans les modèles/\ _ \ _ init \ _ \ _. Py? Cela expliquerait vos résultats différents.) –

+0

@Roger - mes modèles/__ init__.py est juste' __all__ = ['user' , 'autre'] '. – Seth

+0

Ensuite, je m'attendrais à ce que vous obteniez ce que j'ai: http://codepad.org/yWnKyVAW. Avez-vous eu un 'import models.user' ou similaire? (Cette importation va modifier l'objet module models.) –