Partage
  • Partager sur Facebook
  • Partager sur Twitter

Import dans un module

Sujet résolu
Anonyme
    21 octobre 2011 à 21:22:44

    Bonjour,

    Je suis en train de développer un logiciel en python.
    J'ai terminé le développement d'une des parties de ce logiciel.

    Cette "partie" est composé de plusieurs fichiers .py contenant chaque une ou plusieurs classes qui s'importe entre elles.
    La partie a été testé directement dans les fichiers .py en utilisant la technique
    if __name__ == "__main__":
    


    J'ai alors voulu créer un package contenant l'ensemble de ces fichiers. J'ai tous mis dans un dossier, j'ai ajouté un fichier init.py.

    Mais lorsque j'importe une classe de ce package les imports présent dans le fichier contenant cette class ne marchent pas.

    Pour schématiser j'ai :
    • Un package db
      • Un fichier database.py contenant :
        • from table import Table
          from xmltools import *
          from gestiondb import *
          from xml.dom.minidom import Document
          

        • La classe BaseDeDonnees
      • Un fichier table.py contenant :
        • from xmltool import XMLInfos
          from gestiondb import DbInfos
          from xml.dom.minidom import Element
          
        • La classe Table
      • Un fichier xmltools.py contenant :
        • from xml.dom.minidom import parse
          
        • La classe XMLInfos
        • La classe XmlToDb
        • La classe XmlToTable
        • La classe XmlToAttribut
      • Un fichier gestiondb.py contenant :
        • from pymysql.connections import Connection
          
        • La class DbInfos
        • La class GestionDb
    • - Un fichier main.py contenant :
    from db.database import BaseDeDonnees
    db=BaseDeDonnees()
    print(db)
    

    J'ai l'erreur suivante :
    ImportError: No mudule named table


    Il y a-t-il une manière spécifique d'appeler les classes entre elles dans un package?

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      22 octobre 2011 à 12:09:20

      • mypackage/
        • from mypackage.mymodule import myclass
          
        • def myclass:
              pass
          

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        2 décembre 2011 à 19:44:26

        Bonsoir,

        Du coup ce n'est pas très pratique pour le développement de sous-package.

        À l'heure actuelle j'ai développer un package qui marche seul. Maintenant je souhaite l'intégrer comme sous-package d'un nouveau package de "plus haut niveau".
        Il y a-t-il une meilleure méthode que de renommer tous les imports dans le premier package que j'ai développé?

        Merci
        • Partager sur Facebook
        • Partager sur Twitter
          2 décembre 2011 à 21:06:29

          Bonsoir,

          Python3 je présume;
          Il y a possibilité de faire des import relatifs:

          http://www.python.org/dev/peps/pep-032 [...] ative-imports

          .
          ├── db
          │   ├── database.py
          │   ├── __init__.py
          │   └── table.py
          └── main.py


          from db.database import BaseDeDonnees
          
          db = BaseDeDonnees()
          db.makeTable()
          


          from .table import Table
          
          class BaseDeDonnees():
              def makeTable(self):
                  t = Table()
          
          if __name__ == '__main__':
              BaseDeDonnees().makeTable()
          


          class Table():
              def __init__(self):
                  print('init table instance')
          


          Le soucis, c'est si on veut exécuter un fichier du module seul :
          /db$ python3 database.py
          Traceback (most recent call last):
            File "database.py", line 1, in <module>
              from .table import Table
          ValueError: Attempted relative import in non-package


          Alors qu'avec python2.6 ça fonctionnait dans les deux cas juste avec from table import Table.

          Je n'ai pas la motivation pour chercher plus en détail ce soir si quelqu'un à des précisions :)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            5 décembre 2011 à 20:58:47

            Une autre solution, si ton premier package est utile seul, tu peux créer un deuxième package distinct qui aura simplement besoin du premier pour fonctionner.

            Sinon, je crois effectivement qu'il faudra éditer tous tes imports (en relatif ou non). :(
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              6 décembre 2011 à 18:36:48

              Désolé pour le retard j'ai pas trop eu le temps ces derniers jours.

              Les imports relatifs sont pratiques mais ne conviennent pas totalement à mon cas de figure.

              En effet j'ai pensé sortir le package pour l'appeler de l'extérieure mais je préfère tout avoir regroupé dans le même package au final.

              Du coup j'ai tous édité à la main..

              Merci de votre aide
              • Partager sur Facebook
              • Partager sur Twitter

              Import dans un module

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown