108 votes

Impossible d'obtenir l'importation de Python à partir d'un autre dossier

Je n'arrive pas à convaincre Python d'importer un module dans un sous-dossier. Je reçois le message d'erreur lorsque j'essaie de créer une instance de la classe à partir du module importé, mais l'importation elle-même réussit. Voici ma structure de répertoire:

 Server
    -server.py
    -Models
        --user.py
 

Voici le contenu de server.py:

 from sys import path
from os import getcwd
path.append(getcwd() + "\\models") #Yes, i'm on windows
print path
import user

u=user.User() #error on this line
 

Et user.py:

 class User(Entity):
    using_options(tablename='users')

    username = Field(String(15))
    password = Field(String(64))
    email    = Field(String(50))
    status   = Field(Integer)
    created  = Field(DateTime)
 

L'erreur est la suivante: AttributeError: l'objet 'module' n'a pas d'attribut 'User'

164voto

Dana Points 9876

Je crois que vous devez créer un fichier appelé __init__.py dans le répertoire Models afin que python le traite comme un module.

Ensuite, vous pouvez faire:

 from Models.user import User
 

Vous pouvez inclure du code dans les __init__.py (par exemple, le code d'initialisation requis par quelques classes différentes) ou le laisser vide. Mais ça doit être là.

29voto

nosklo Points 75862

Vous devez créer __init__.py sur le sous-dossier Models . Le fichier peut être vide. Il définit un package.

Ensuite, vous pouvez faire:

 from Models.user import User
 

Lisez tout à ce sujet dans le tutoriel Python, ici .

Il y a aussi un bon article sur l'organisation des fichiers de projets Python ici .

13voto

bobince Points 270740

importation d'utilisateurs

u=utilisateur.Utilisateur() #erreur sur cette ligne

En raison de l'absence de __init__ mentionnés ci-dessus, vous attendez un ImportError qui permettrait de rendre le problème plus clairement.

Ce n'est pas parce que "utilisateur" est aussi un module existant dans la bibliothèque standard. Votre instruction d'importation que l'on attrape et tente de trouver l'Utilisateur de la classe de l'intérieur; qui n'existe pas, alors seulement vous obtenez le message d'erreur.

Il est généralement une bonne idée de faire de l'importation absolue:

import Server.Models.user

pour éviter ce genre d'ambiguïté. En effet, à partir de Python 2.7 'importer' utilisateur ne le regretterez pas par rapport à ce module.

Si vous voulez vraiment relatif des importations, vous pouvez avoir explicitement dans Python 2.5 et à l'aide de la un peu laid syntaxe:

from .user import User

11voto

glarrain Points 843

La bonne façon d'importer un module situé sur un dossier parent, lorsque vous ne disposez pas d'une structure de package standard, est la suivante:

 import os, sys
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(CURRENT_DIR))
 

(vous pouvez fusionner les deux dernières lignes mais cette façon est plus facile à comprendre).

Cette solution est multi-plateforme et suffisamment générale pour ne pas être modifiée dans d'autres circonstances.

8voto

Harper Shelby Points 13395

Vous êtes absent __init__.py. Depuis le tutoriel Python:

L' __init__.py les fichiers sont requis pour faire de Python traiter les répertoires contenant des paquets; c'est fait pour prévenir les répertoires avec une commune nom, tels que la chaîne, à partir de involontairement cacher valide les modules qui se produisent plus tard dans le module de recherche chemin d'accès. Dans le cas le plus simple, __init__.py peut-être simplement un fichier vide, mais il peut également exécuter l'initialisation code de l'emballage ou de l'ensemble de la __tous__ variable, décrit plus loin.

Mettre un fichier vide nommé __init__.py dans votre répertoire des Modèles, et tous doivent être dorés.

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