Je n'arrive pas à convaincre Python d'importer un module dans un sous-dossier. J'obtiens l'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épertoires:
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: AttributeError: l'objet 'module' n'a pas d'attribut 'User'
Réponses:
Je pense 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:
Vous pouvez inclure du code dans le
__init__.py
(par exemple le code d'initialisation dont certaines classes différentes ont besoin) ou le laisser vide. Mais ça doit être là.la source
Vous devez créer
__init__.py
sur leModels
sous - dossier. Le fichier est peut-être vide. Il définit un package.Ensuite, vous pouvez faire:
Lisez tout à ce sujet dans le didacticiel python, ici .
Il y a aussi un bon article sur l'organisation des fichiers des projets python ici .
la source
En raison du manque de __init__ mentionné ci-dessus, vous vous attendriez à une ImportError qui clarifierait le problème.
Vous n'en obtenez pas car «user» est également un module existant dans la bibliothèque standard. Votre instruction d'importation saisit celui-là et essaie de trouver la classe User à l'intérieur; cela n'existe pas et ce n'est qu'alors que vous obtenez l'erreur.
C'est généralement une bonne idée de rendre votre importation absolue:
pour éviter ce genre d'ambiguïté. En effet, à partir de Python 2.7, 'import user' ne ressemblera pas du tout au module actuel.
Si vous voulez vraiment des importations relatives, vous pouvez les avoir explicitement dans Python 2.5 et plus en utilisant la syntaxe quelque peu laide:
la source
La bonne façon d'importer un module situé sur un dossier parent, lorsque vous n'avez pas de structure de package standard, est:
(vous pouvez fusionner les deux dernières lignes mais cette façon est plus facile à comprendre).
Cette solution est multiplateforme et est suffisamment générale pour ne pas devoir être modifiée dans d'autres circonstances.
la source
Il vous manque __init__.py. À partir du didacticiel Python:
Mettez un fichier vide nommé __init__.py dans votre répertoire Models, et tout devrait être en or.
la source
comment écrivez-vous les paramètres
os.path.dirname
.... commande?la source
Ma méthode préférée est d'avoir __init__.py sur chaque répertoire qui contient des modules qui sont utilisés par d'autres modules, et au point d'entrée, remplacez sys.path comme ci-dessous:
Cela rend les fichiers dans les répertoires spécifiés visibles pour l'importation, et je peux importer l'utilisateur à partir de Server.py.
la source
Après avoir parcouru les réponses données par ces contributeurs ci-dessus - Zorglub29, Tom, Mark, Aaron McMillin, lucasamaral, JoeyZhao, Kjeld Flarup, Procyclinsur, martin.zaenker, tooty44 et déboguer le problème auquel j'étais confronté, j'ai découvert un cas d'utilisation différent en raison auquel je faisais face à ce problème. D'où l'ajout de mes observations ci-dessous pour la référence de quiconque.
Dans mon code, j'avais une importation cyclique de classes. Par exemple:
J'ai eu l'erreur suivante lorsque j'ai essayé d'exécuter python -m pytest tests / test_utilities.py pour exécuter des UT écrits dans test_utilities.py.
La façon dont j'ai résolu l'erreur était de re-factoriser mon code pour déplacer la fonctionnalité dans la classe d'importation cyclique afin que je puisse supprimer l'importation cyclique de classes.
Remarque, j'ai un
__init__.py
fichier dans mon dossier ' src ' ainsi que dans mon dossier ' tests ' et j'ai toujours pu me débarrasser de ' ImportError » simplement en re-factorisant le code.Le lien stackoverflow suivant fournit beaucoup plus de détails sur la dépendance circulaire en Python .
la source