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 :

probleme d'import de paquets avec pytest


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2023
    Messages : 2
    Par défaut probleme d'import de paquets avec pytest
    Bonjour

    j'ai le projet suivant:
    un dossier projet:
    dans le dossier projet j'ai 2 dossiers:
    • app
    • test


    dans app j'ai 4 fichier:
    • main.py qui fait un calcul en appelant une fonction, cette fonction est définie dans un 2e fichier
    • fonction.py qui définit ma foncction appelée par main, et qui fait appel à des variables dans un 3e fichier
    • config.py qui contient les variables nécéssaires pour le fichier fontion.py
    • __init__.py



    j'ai donc les imports en question dans les fichiers py qui le requierent; import config, import fonctions

    je lance le programme tout est OK


    mon souci:
    dans le dossier test, j'ai deux fichiers;
    • test_fonctions.py qui teste la fonction définie dans fonction.py à l'aide de pytest
    • __init__.py


    dans test fonctions.py j'ai donc au début du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from app.fonctions import calcul
    quand je lance pytest, j'ai un bug avec l'import des paquets.
    je corrige alors le script fonction.py au niveau de l'import, je mets ca :
    from app import config
    au lieu de
    import config
    je lance pytest et ca marche
    mais maintenant si je lance le programme, il me dit qu"il y a un soucis à l'import dans le fichier fonction.py. je dois reecrirela syntaxe de l'import et mettre je comprends rien
    quel est le probleme svp?
    je vous envoie mes fichiersmain.py
    fonctions.py
    config.py
    test_fonctions.py

    projet.zip

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    le chemin est différent selon d'où tu (le programme) te trouves

    pour les imports depuis d'autres répertoires il est conseille d'utilise sys.path.append
    https://pythonhow.com/what/what-to-d...der-in-python/
    https://www.w3docs.com/snippets/pyth...nt-folder.html

  3. #3
    Candidat au Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2023
    Messages : 2
    Par défaut
    je me place dans le répertoire projet quand je lance le script ou pytest.
    or selon que je lance le script ou pytest, le chemin d'accès vers les modules ne sont pas les mêmes c'est ca?

    merci sve@r, ej crois que j'ai compris

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saradenantes Voir le message
    or selon que je lance le script ou pytest, le chemin d'accès vers les modules ne sont pas les mêmes c'est ca?
    Exactement
    Petit exemple plus précis et exécutable
    Tout d'abord tu crées un dossier "calc". Ensuite tu crées les 3 fichiers suivants
    • fichier main.py
      Code python : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      #!/usr/bin/env python3
      # coding: utf-8
       
      from calc.fonction import *
      for i in range(1, 5):
      	print(i, cumul(i))
    • fichier calc/base.py
      Code python : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      #!/usr/bin/env python3
      # coding: utf-8
       
      def isNumber(n):
      	return isinstance(n, (int, float))
    • fichier calc/fonction.py
      Code python : 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
      18
      19
      20
      21
      22
      #!/usr/bin/env python3
      # coding: utf-8
       
      if __name__ == "__main__":
      	import sys
      	sys.path.append("..")
      	sys.path.append(".")
      # if
       
      from calc import base
      def cumul(n):
      	if not base.isNumber(n):
      		print("%s n'est pas un nombre !!!" % n)
      		return
      	# if
       
      	return n*(n+1) // 2
      # cumul()
       
      # Test
      if __name__ == "__main__":
      	print("test:", 100, cumul(100))

    Code complet ici...exemple.tar (format tar que je viens de découvrir qu'on pouvait intégrer dans les posts)

    Ensuite tu appelles python main.py. Puis tu appelles python calc/fonction.py. Puis tu te déplaces dans le dossier "calc" et là tu appelles python fonction.py.
    Et ensuite tu essayes de commenter l'une ou l'autre des lignes sys.path.append(...) et tu réessayes les 3 opérations voir ce que ça change.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par saradenantes Voir le message
    je comprends rien
    quel est le probleme svp?
    Pour compléter la réponse de umfred, si tu as une arborescence de ce type...
    main.py
    toto/xxx.py
    toto/yyy.py
    ... et que tu appelles "main.py", alors Python s'exécute depuis cet emplacement. Il verra le dossier "toto" et tu peux alors importer from toto import xxx ou import toto.xxx. Et si "xxx.py" a besoin, pour travailler, de yyy.py, vu que "xxx" est appelé depuis "main", alors il fait partie du programme "main" et s'il veut importer yyy il devra demander from toto import yyy ou import toto.yyy.

    Mais si maintenant tu appelles "xxx.py" pour le tester, comme s'il était un code indépendant, alors Python n'est plus au niveau de "main.py" mais de "xxx.py". Là le dossier "toto" n'est pas vu puisque là tu es dans ce dossier. Et l'import alors doit se faire via import yyy ou from yyy import *.

    Tu peux toutefois détecter si "xxx" est importé ou exécuté via la variable __name__ qui vaut "__main__" s'il est exécuté. Donc tu peux coder "si je me trouve en l'état d'exécution alors il me faut rajouter .. dans sys.path afin de pouvoir continuer à voir toto".
    Ainsi "xxx.py" pourrait se coder ainsi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if __name__ == "__main__":
    	import sys
    	sys.path.append("..")
    # if
    from toto import yyy
    Et là ça fonctionnera dans les deux cas (xxx importé/xxx exécuté).

    A appliquer à ton projet.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. probleme d'import de module avec openERP
    Par angelina88 dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 17/07/2012, 22h02
  2. probleme de importation de composant activex avec mapwindows
    Par moustaf_26 dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 24/11/2011, 17h50
  3. probleme d'import avec eclipse 3.3.0
    Par fafoula dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 08/11/2007, 10h47
  4. probleme d'import avec eric python
    Par remitbo dans le forum Général Python
    Réponses: 1
    Dernier message: 20/05/2007, 22h57
  5. probleme d'import de fichier txt avec des tab
    Par lecureuil dans le forum Access
    Réponses: 4
    Dernier message: 23/08/2005, 19h22

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