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 :

Modularité et appel de fonction


Sujet :

Python

  1. #1
    P.G
    P.G est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 158
    Points : 73
    Points
    73
    Par défaut Modularité et appel de fonction
    Bonjour à tous,

    Débutant en python je bute sur un problème simple comment mettre des fonctions dans un module.

    Voilà le contexte :

    le module (fichier monModule.py)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # -*- coding: utf-8 -*-
     
     
    def monImpression():
        print ("Essai")
    Le programme appelant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # -*- coding: utf-8 -*-
     
    from monModule import *
     
    monModule.monImpression()

    Et j'obtiens l'erreur AttributeError: 'module' object has no attribute 'monImpression'

    si quelqu'un a une idée ?

    Merci beaucoup.

    P.G

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    En utilisant la syntaxe from <source> import <item> tu intègres directement tes items dans l'espace de nom "global" de ton programme. Dans ce cas, il ne faut pas appeler <source>.<item>() mais directement <item>().
    Dans ton cas, ça se traduira par
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # -*- coding: utf-8 -*-
     
    from monModule import *
     
    monImpression()

    La syntaxe qui te permet d'appeler ta fonction à ta manière est celle-là: import <source>. A ce moment là, ça deviendra pour toi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # -*- coding: utf-8 -*-
     
    import monModule
     
    monModule.monImpression()
    Les deux façons de faire ont chacune leurs avantages et leurs inconvénients (le premier étant que tu peux très bien avoir deux modules différents ayant tous deux défini une fonction de même nom)...
    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]

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Remplacez le "from monModule import *" par "import monModule" et prenez le temps de lire/relire le python tutorial sur les modules.

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

  4. #4
    P.G
    P.G est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 158
    Points : 73
    Points
    73
    Par défaut
    Bonjour à tous,

    Et merci pour vos réponses.

    j'ai lu des posts sur les modules avant de créer le mien

    Aucune des techniques présentées dans les réponses ne fonctionnent.

    Comme si le monModule.py n'était pas trouvé alors qu'il est dans le même

    dossier que le script principal essai_appel_module.py.

    (Le tout avec pyzo)

    donc toujours la même erreur ImportError: No module named 'monModule'

    ??

    Merci pour vos lumières.

    P.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Ce message d'erreur là:
    Citation Envoyé par P.G Voir le message
    donc toujours la même erreur ImportError: No module named 'monModule'
    est différent de celui mentionné dans le premier post:
    AttributeError: 'module' object has no attribute 'monImpression'
    Après on fait ce qu'on peut avec les informations que vous donnez.

    Le plus simple de reproduire votre soucis en lançant la console Python et en tapant:
    car difficile de savoir comment vous avez configuré "Pyzo".

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

  6. #6
    P.G
    P.G est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 158
    Points : 73
    Points
    73
    Par défaut
    Re bonjour,

    Oui bien sur c'est difficile de dépanner ou d'aider à distance merci beaucoup pour votre aide.

    Pour simplifier les essais j'essaye la démo du lien que vous m'avez donné à savoir fibo.

    Le fichier fibo.py est dans le dossier courant qui sert aux essais l'erreur est la suivante dans la console de pyzo :

    In [1]: import fibo
    ---------------------------------------------------------------------------
    ImportError Traceback (most recent call last)
    <ipython-input-1-4105c89a6fa8> in <module>()
    ----> 1 import fibo

    ImportError: No module named 'fibo'

    visiblement le chemin de ce dossier courant (S:\A SAUVER PYZO\ESSAIS) n'est pas trouvé :

    In [3]: import sys

    In [4]: print (sys.path)
    ['', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\python34.zip', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\DLLs', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\lib', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\lib\\site-packages', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\lib\\site-packages\\setuptools-12.1-py3.4.egg', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\lib\\site-packages\\IPython\\extensions']

    le dossier courant n'est pas dans ce chemin.

    Comment l'y mettre ?

    Merci encore.

    P.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Ce qu'on nomme "dossier courant" est ce qui est rendu dans sys.path par les "" qui est le premier élément de la liste. Après ce que vous appelez vous dossier courant est une autre histoire.
    A la console Windows faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cd <repertoire qui contient fibo.py>
    Vérifiez que le "répertoire courant" contient bien fibo.py:
    Alors vous lancez Python puis à la console Python (et non celle d'IPython), vous tapez:
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    P.G
    P.G est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 158
    Points : 73
    Points
    73
    Par défaut
    Re hello,

    Bon c'est résolu en ajoutant le dossier courant de 'travail' dans le path de python avec cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sys
    sys.path.insert(0,"S:\A SAUVER PYZO\ESSAIS")
    A partir de là le dossier de travail fait partie de la liste et donc les codes ci-dessous fonctionnent :

    Le module fibo.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
    # Fibonacci numbers module
     
    def fib(n):    # write Fibonacci series up to n
        a, b = 0, 1
        while b < n:
            print(b, end=' ')
            a, b = b, a+b
        print()
     
    def fib2(n): # return Fibonacci series up to n
        result = []
        a, b = 0, 1
        while b < n:
            result.append(b)
            a, b = b, a+b
        return result
    Le script utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import sys
    sys.path.insert(0,"S:\A SAUVER PYZO\ESSAIS")
     
    from fibo import *
    fib(500)
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    In [17]: (executing lines 1 to 5 of "essai_fibo.py")
    1 1 2 3 5 8 13 21 34 55 89 144 233 377 
     
    In [18]:
    idem pour le test du départ :

    monModule.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # -*- coding: utf-8 -*-
     
     
    def monImpression():
        print ("Essai")
    et le script utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # -*- coding: utf-8 -*-
    import sys
    sys.path.insert(0,"S:\A SAUVER PYZO\ESSAIS")
     
    print(sys.path)
     
    from monModule import *
     
    monImpression()
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    In [16]: (executing lines 1 to 9 of "essai_appel_module.py")
    ['S:\\A SAUVER PYZO\\ESSAIS', 'S:\\A SAUVER PYZO\\ESSAIS', 'S:\\A SAUVER PYZO\\ESSAIS', 'S:\\A SAUVER PYZO\\ESSAIS', '', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\python34.zip', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\DLLs', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\lib', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\lib\\site-packages', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\lib\\site-packages\\setuptools-12.1-py3.4.egg', 'C:\\Documents and Settings\\Patrick\\Bureau\\pyzo2015a\\lib\\site-packages\\IPython\\extensions', 'S:\\A SAUVER PYZO\\ESSAIS']
    Essai
    pour nettoyer le path on peu utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sys.path.remove("S:\A SAUVER PYZO\ESSAIS")
    Merci encore pour le coup de main.

    P.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Ici un tuto qui m'a beaucoup appris sur les imports...
    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]

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

Discussions similaires

  1. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  2. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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