IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

import basique et struture de repertoire


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 76
    Points : 58
    Points
    58
    Par défaut import basique et struture de repertoire
    Salut à tous,

    J'aimerais créer un projet Python qui utilise SQLAlchemy et pour lequel les fichiers de model soient séparés dans un répertoire (module) différent.
    Malheureusement j'ai encore du mal à cerner tout les détails du système d'import ou de package de Python et j'aimerais comprendre pourquoi j'ai l'erreur suivante :

    ImportError: cannot import name 'User' from 'model.user' (/Users/toto/Project/staty/model/user.py)

    dans le fichier suivant (alchemy.py) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    from model.user import User
     
    engine = create_engine('sqlite:///:memory:', echo=True)
    Session = sessionmaker(bind=engine)
    session = Session()
     
    Base = declarative_base()
    Base.metadata.create_all(engine)
     
    ed_user = User(name='ed', fullname='Ed Jones', nickname='edsnickname')
    session.add(ed_user)
     
    session.commit()

    avec la structure de repertoire suivante :

    staty
    - bin
    - include
    - lib
    - model
    - user.py
    alchemy.py
    pyvenv.cfg

    dont le fichier user.py est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    from sqlalchemy import Column, Integer, String
    from alchemy import Base
     
     
    class User(Base):
        __tablename__ = 'users'
     
        id = Column(Integer, primary_key=True)
        name = Column(String)
        fullname = Column(String)
        nickname = Column(String)
     
        def __repr__(self):
            return "<User(name='%s', fullname='%s', nickname='%s')>" % (
                self.name, self.fullname, self.nickname)
    J'aimerais pouvoir bien séparer mes différents types de fichiers et à terme séparer également le code lié à la création / gestion de ma BDD en dehors du fichier de base alchemy.py.
    J'ai essayé de créer des fichiers __init__.py dans mes repartoires mais apparemment après la version 3.3 de Python ce n'est plus nécessaire.

    Qu'en pensez-vous ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 351
    Points : 36 875
    Points
    36 875
    Par défaut
    Salut,

    Citation Envoyé par dorus-one Voir le message
    Qu'en pensez-vous ?
    Si alchemy.py effectue from model.user import User qui lui même exécute from alchemy import Base, vous avez un import "circulaire". Ce qui n'est pas vraiment une bonne idée et peut être évité en poussant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from sqlalchemy.ext.declarative import declarative_base
    Base = declarative_base()
    dans un module base.py.
    Puis l'importer via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from sqlalchemy import Column, Integer, String
    from base import Base
     
     
    class User(Base):
        __tablename__ = 'users'
       ...
    dans les déclarations des tables.

    Et l'importer un peu différement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
     
    import base
     
    from model.user import User
     
    engine = create_engine('sqlite:///:memory:', echo=True)
    Session = sessionmaker(bind=engine)
    session = Session()
     
    base.Base.metadata.create_all(engine)
     
    ...
    pour le chargement.

    - W

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Ici:
    avec la structure de repertoire suivante :

    staty
    - bin
    - include
    - lib
    - model
    - user.py
    alchemy.py
    pyvenv.cfg
    tu veux dire que user.py se trouve dans un dossier staty ?

    Alors pourquoi fais-tu from model.user import User alors que ce devrait être from staty.user import user ?

    En plus tu donnes pour erreur:
    ImportError: cannot import name 'User' from 'model.user' (/Users/toto/Project/staty/model/user.py)
    ce qui ne correspond pas à ton code.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Ici:

    tu veux dire que user.py se trouve dans un dossier staty ?

    Alors pourquoi fais-tu from model.user import User alors que ce devrait être from staty.user import user ?

    En plus tu donnes pour erreur: ce qui ne correspond pas à ton code.
    Oula non pardon, je te prie de m'excuser j'ai oublié quelques espaces afin de dire que mon fichier user.py se trouve bien dans le repertoire "model". Désolé pour le petit oubli qui porte à confusion.


    Si alchemy.py effectue from model.user import User qui lui même exécute from alchemy import Base, vous avez un import "circulaire". Ce qui n'est pas vraiment une bonne idée et peut être évité en poussant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from sqlalchemy.ext.declarative import declarative_base
    Base = declarative_base()
    dans un module base.py.
    Effectivement le problème venait de là. Merci à vous pour l'aide. Je commence déjà à mieux comprendre la philosophie d'import.

Discussions similaires

  1. Problème imports basiques EasyEclipse
    Par Ohmygosh dans le forum EDI/RAD
    Réponses: 0
    Dernier message: 25/02/2011, 23h54
  2. Importer des repertoires avec GXT
    Par dasdo dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 12/08/2009, 12h12
  3. Réponses: 3
    Dernier message: 24/06/2009, 17h59
  4. [BO XI] Import infoView vers Repertoire physique
    Par FloLens dans le forum Webi
    Réponses: 7
    Dernier message: 14/11/2008, 16h59
  5. [Python 2.3.4] Import d'un repertoire dans le parent
    Par efficks dans le forum Général Python
    Réponses: 3
    Dernier message: 23/01/2007, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo