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 :

Package et import [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Par défaut Package et import
    Bonjour tout le monde,

    Je débute sous Python et je rencontre un problème avec le notion de package.
    Voici l'arborescence de mon projet :

    racine/
    module/
    __init__.py
    f1.py
    f2.py
    test.py

    Mon f1.py défini une classe "C1" et la classe dépend d'une fonction définie dans le fichier f2.py, donc dans mon fichier f1.py, il y a "import f2".

    Dans mon script test.py, je veux instancier un objet de classe C1, donc j'importe le fichier f1.py dans le script test.py avec "import module.f1", mais j'ai une erreur qui est "import f2" ne marche pas car f2 est introuvable.
    Du coup, dans mon fichier f1.py j'ai mis "import module.f2".

    Mon script test.py marche sans problème.

    Mais, il m'arrive de modifier mon fichier f1.py pour ajouter de nouvelles méthodes et j'ajoute toujours un "if __name__ == '__main__':" pour pouvoir tester directement mon script, or avec le "import module.f2", je ne peux plus lancer mon script comme avant : "shell > ./f1.py" car python ne trouve pas le package module.

    Du coup, si je veux tester ma modification du fichier f1.py, je vais devoir créer un script dans la racine ... ca me rajoute une étape en plus :/
    J'aimerais savoir si c'était normal que je rencontre ce problème et s'il y a une solution.

    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Bonjour Baloopacha,

    as-tu essayé avec des imports relatifs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import .f2
    ou
    from .f2 import ma_fonction

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Par défaut
    Bonjour Fifan31,

    Je suis désolé de ne répondre que maintenant. Je n'avais pas vu le mail du forum qui m'indique qu'une personne a répondu à mon post.

    Je viens de voir que dans mon message, l'arborescence n'a pas été respecté du coup (problème d'espaces qui ont été supprimé). Voici la bonne arborescence (Je profite pour la compléter)

    racine/
    test.py
    module/
    __init__.py
    f1.py
    f2.py
    module2/
    __init__.py
    f1.py
    f2.py

    Du coup, le problème toujours le meme avec un chemin relatif. Le dossier actuelle sera toujour celui du script qui est exécuté.
    Du coup, avec l'avancement de mon projet, je me retrouve avec un autre package (module2) et une fonction de ce package utilise une fonction du package module. Comment je peux faire l'import d'un fichier du package module dans un fichier du package module2 ?

    Je suis obligé de faire un "import ...module.f2" ?

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Il serait bien de créer un __init__.py aussi dans le dossier du script test.py

    En considérant que ton terminal est dans racine et que tu lances ton code avec python3 test.py, alors tu dois pouvoir faire:

    dans test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from module import f1, f2
    from module2 import f1, f2  #changer les noms bien sur
    dans module/f1.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from module import f2
    from module2 import f1, f2
    dans module2/f1.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from module import f1, f2
    from module2 import f2
    Par contre le problème se pose si tu lances directement module/f1.py, dans ce cas crée un simple script dans racine pour le lancer, parce que s'il existe une solution, elle ne conviendra pas pour un lancement avec test.py.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Salut,

    Citation Envoyé par Baloopacha Voir le message
    Du coup, avec l'avancement de mon projet, je me retrouve avec un autre package (module2) et une fonction de ce package utilise une fonction du package module. Comment je peux faire l'import d'un fichier du package module dans un fichier du package module2 ?
    Le chemin des modules n'est pas si absolu puisque sa racine est celle du script principal (qui devient "main").
    Donc si on veut qu'"import module1" fonctionne, on peut ajouter le chemin de la racine dans PYTHONPATH (puisque c'est pas main qui va le définir pour nous)...
    Ce qui évite les imports relatifs.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Par défaut
    Merci à VinsS et à wiztricks.

    Je vais plutôt partir sur la solution de VinsS qui je trouve convient mieux dans mon cas, mais je prends note de ta solution wiztricks pour un futur projet.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compilation package (pb import .jar)
    Par caparenlive59 dans le forum Général Java
    Réponses: 7
    Dernier message: 08/07/2010, 15h01
  2. Package .jar à importer
    Par foxrol dans le forum Maven
    Réponses: 6
    Dernier message: 18/08/2009, 16h07
  3. problème de package d'importation
    Par Mangacker dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/01/2007, 11h06
  4. Réponses: 2
    Dernier message: 06/12/2006, 11h50
  5. [Language][debutant] package et import : probleme
    Par debdev dans le forum Langage
    Réponses: 11
    Dernier message: 15/03/2005, 12h29

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