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 :

un module qui ne contient pas une fonction qu'il contient :?


Sujet :

Python

  1. #1
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut un module qui ne contient pas une fonction qu'il contient :?
    Bonjour !

    je vien de faire un petit module ( tout petit mais bien utile )
    mais le probleme est que celuici ne fonctionne pas

    en voici le code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import ctypes
    import os
     
     
    os.environ['PATH'] = os.environ['PATH'] + ';' + os.path.abspath(os.path.dirname(__file__))
     
    p = ctypes.windll.simpleio
    p.init()
     
     
     
    LPT1 = 0x0378
    LPT2 = 0x0278
     
     
    class parallele:
        def __init__(self, port = LPT1):
            self.port = port
            #voila c'est tout :p
     
        def inp(self, adresse = 0):
            val = p.inp(self.port + adresse, valeur)
            return val
     
        def out(self, valeur, adresse = 0):
            p.outp(self.port + adresse, valeur)
    dans celui ci je declare deux fonctions : out et inp

    le probleme, c'est que quand j'appel une de ces fonctions j'obtient un message que m'informe que le module ne contient pas cette fonction :

    Traceback (most recent call last):
    File "<stdin>", line 1, in ?
    AttributeError: 'module' object has no attribute 'inp'
    quelqu'un pourait il m'expliquer cela?

    merci d'avance

    +
    pensez au

  2. #2
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    bonsoir

    Es tu sur que ctypes est installer sur ton ordi?

    sinon essai en ajoutant self entre p et inp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def inp(self, adresse = 0):
            val = p.self.inp(self.port + adresse, valeur)
            return val
    sinon je pense que python pense que inp est une méthode définie dans ctypes et non dans ta class!

    bon courage

  3. #3
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    ctypes et bien installer !

    j'ai fait usage de tes remarques :

    l'ajout de self ne change rien

    et j'ai esseiller de mettre un autre non à la place de inp et cela n'a rien donner non plus
    pensez au

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 36
    Points
    36
    Par défaut
    je vois pas l'intéret d'utiliser un self ici parceque ca ne donne aucun sens à l'appel puisqu'il devient récursif et boucle infiniement!!

    par contre comme c'est écris t'es sur que ton machin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = ctypes.windll.simpleio
    a une méthode inp ?

  5. #5
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    justement non, la métode inp fait partie de sa class (si j'ai tout compris a son code)

    self permet de spécifier justement qu'on fait appel a une fonction faisant partie de la class
    sinon python ne trouve pas de méthode inp.

    lance donc un test a l'intérieur de ta méthode.
    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def inp(self, adresse = 0):
            print p
            val = p.self.inp(self.port + adresse, valeur)
            return val
    tu dis que tu as essayé de changé les noms, ca te donne quoi niveau code.

  6. #6
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    j'ai verifier la doc ctypes, il n'y a pas de méthode inp.

    Peux tu nous dire ce que doivent faire tes méthodes. Ca peut aider.
    merci

  7. #7
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    lance donc un test a l'intérieur de ta méthode.
    du genre
    Code :

    def inp(self, adresse = 0): print p val = p.self.inp(self.port + adresse, valeur) return val
    je vien d'esseiller et sa donne toujours la même chose

    tu dis que tu as essayé de changé les noms, ca te donne quoi niveau code.
    sa donne :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import ctypes
    import os
     
     
    os.environ['PATH'] = os.environ['PATH'] + ';' + os.path.abspath(os.path.dirname(__file__))
     
    p = ctypes.windll.simpleio
    p.init()
     
     
     
    LPT1 = 0x0378
    LPT2 = 0x0278
     
     
    class parallele:
        def __init__(self, port = LPT1):
            self.port = port
            #voila c'est tout :p
     
        def pinp(self, adresse = 0):
            val = p.inp(self.port + adresse, valeur)
            return val
     
        def pout(self, valeur, adresse = 0):
            p.outp(self.port + adresse, valeur)
    j'ai aussi mis des autres nom que pinp et pout qui n'avais strictement rien avoir avec python mais sa n'a rien donner non plus

    si non ce code sert à lire et ecrire sur le port parallele
    la fonction inp pour lire les données et la fonction out pour ecrire desus


    voila

    merci pour votre aide !
    pensez au

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 36
    Points
    36
    Par défaut
    Non mais quand tu fait p.inp de toute facon ca fait appelle a une méthode inp d'une classe située là.
    Or j'ai regardé dans la doc comme airod et elle n'est pas là.

    pour ce qui est de ce code là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def inp(self, adresse = 0):
            val = p.self.inp(self.port + adresse, valeur)
            return val
    le self est redondant. L'opérateur de résolution de portée sert bien à cela. Ici Python ne vas pas comprendre et penser que self désigne la méthode membre inp de ta classe 'parallele'.

    Je pense que l'erreur ne vient pas de cette partie de code mais bien de ton utilisation de ctypes.

  9. #9
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Tu peux regarder le code de la bibliothèque pyprallele ( http://pyserial.sourceforge.net/pyparallel.html ) (ou même mieux la réutiliser ) qui fait exactement ce que tu veux. Elle marche parfaitement. Il manque simplement la fonction (qui nécessite 3 lignes de plus à ajouter) pour lire ce qu'il y a dans sur le port parallel.

    il me semble que je rajoutais une fonction du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def getData(self):
        return _pyparallel.inp(self.ctrlRegAdr)

  10. #10
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par Guigui_
    Tu peux regarder le code de la bibliothèque pyprallele ( http://pyserial.sourceforge.net/pyparallel.html ) (ou même mieux la réutiliser ) qui fait exactement ce que tu veux. Elle marche parfaitement. Il manque simplement la fonction (qui nécessite 3 lignes de plus à ajouter) pour lire ce qu'il y a dans sur le port parallel.

    il me semble que je rajoutais une fonction du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def getData(self):
        return _pyparallel.inp(self.ctrlRegAdr)

    en fait je me suis inspiré de ce code.

    moi je voudrais une bibliotheque qui fait exactement ou presque la même choses mais qui fonctionne differament.
    pensez au

  11. #11
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Dans ce code, pourquoi y-a-t-il une référence au paramètre 'valeur' qui est inconnu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def pinp(self, adresse = 0):
            val = p.inp(self.port + adresse, valeur)
            return val
    Et si tu nous écris cela
    Traceback (most recent call last):
    File "<stdin>", line 1, in ?
    AttributeError: 'module' object has no attribute 'inp'
    C'est que tu as du écrire autre chose (que la classe que tu nous as montrée) pour que te soit généré cette erreur

  12. #12
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    pour la variable valeur de pinp c'est une erreur de ma part elle n'a pas lieu d'exister donc on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def pinp(self, adresse = 0):
            val = p.inp(self.port + adresses)
            return val
    pour ta deuxieme question je n'ai que ce module et à partir de la console, j'importe mon module puis je créer un objet à partir du quel j'appel mes fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import parallele
    >>> obj = parallele.Parallele
    >>> obj.pinp()
    0
    voila je vien de réusir à utiliser mon mudule !!

    mon erreur vennais du fait que je n'appelais pas correctement la fonction.
    en fait je créais une variable qui contenait le module et non la classe

    Merci de votre aide qui m'a permis de progrésser.

    +
    pensez au

  13. #13
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Normal, il faut taper ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> import parallele
    >>> obj = parallele.parallele()
    >>> obj.pinp()
    Dans ton code, obj valait parallele (le module) et nom la classe

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/12/2009, 07h58
  2. REGEX qui ne contient pas une sous-chaine
    Par Franky731 dans le forum C#
    Réponses: 4
    Dernier message: 02/04/2009, 15h11
  3. [RegEx] Je recherche une chaîne qui ne contient pas une certaine chaîne
    Par johann51 dans le forum Langage
    Réponses: 5
    Dernier message: 19/03/2008, 16h42
  4. Réponses: 1
    Dernier message: 28/01/2008, 12h21
  5. Réponses: 3
    Dernier message: 20/02/2007, 15h48

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