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 :

AttributeError: 'module' object has no attribute 'ipv4_cksum


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut AttributeError: 'module' object has no attribute 'ipv4_cksum
    Bonjour,

    J'utilise le module PCS (Packets Construction Set) pour construire des packets ICMPv6. J'ai installé ce module via la commande apt-get install sur le dernier Ubuntu 32 bits. Le module semble bien installé puisque je m'en sert plusieurs fois dans mon programme.

    Dans mon programme, une des lignes appel une méthode d'une des classes du module qui elle même appelle une autre méthode d'une autre classes.

    Pour faire simple, j'appelle la méthode "icmp6.cksum()" qui est dans la classe "pcs.packets.icmp6". Cette méthode appelle la "méthode ipv4_cksum(pkt)" qui est dans la classe "pcs.packets.ipv4".

    Cependant quand j’exécute mon code, il y a une erreur située dans la classe icmp6 qui dit : AttributeError: 'module' object has no attribute 'ipv4_cksum.

    Je ne comprend pas pourquoi car cette méthode existe bien dans la classe ipv4. Le fait que la méthode ipv4_cksum soit définie comme static est il en cause ?

    Pour résumé:

    Dans mon programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    icmp6.checksum  = icmp6.cksum(ip6)
    Dans la fonction cksum de la classe icmp6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return pcs.packets.ipv4.ipv4_cksum(pkt)
    Dans cette classe il y a bien au dessus "import pcs.packets.ipv4"

    La méthode ipv4_cksum de la classe ipv4
    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
    def ipv4_cksum(bytes):
            """Static method to: Calculate and return the IPv4 header checksum
               over the string of bytes provided."""
     
            tmpbytes = bytes
            total = 0
            if len(tmpbytes) % 2 == 1:
                tmpbytes += "\0"
            for i in range(len(tmpbytes)/2):
                total += (struct.unpack("!H", tmpbytes[2*i:2*i+2])[0])
            total = (total >> 16) + (total & 0xffff)
            total += total >> 16
            return ~total & 0xffff
     
            ipv4_cksum = staticmethod(ipv4_cksum)
    Message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Traceback (most recent call last):
      File "test2.py", line 49, in <module>
        p.construct()                     
      File "test2.py", line 40, in construct
        icmp6.checksum  = icmp6.cksum(ip6)
      File "/usr/lib/python2.7/dist-packages/pcs/packets/icmpv6.py", line 147, in cksum
        return pcs.packets.ipv4.ipv4_cksum(pkt)
    Merci beaucoup.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Comme vous le faites vous-même remarquer, ipv4 est un module et une classe, et ipv4_cksum() est définie comme méthode statique de la classe ipv4, pas comme fonction du module ipv4*! Donc, faut écrire*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return pcs.packets.ipv4.ipv4.ipv4_cksum(pkt)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Comme vous le faites vous-même remarquer, ipv4 est un module et une classe, et ipv4_cksum() est définie comme méthode statique de la classe ipv4, pas comme fonction du module ipv4*! Donc, faut écrire*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return pcs.packets.ipv4.ipv4.ipv4_cksum(pkt)
    Ah oui en effet ca marche mieux, merci. Mais j'ai de nouvelles erreurs.

    J'ai d'abord eu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: unbound method ipv4_cksum() must be called with ipv4 instance as first argument (got str instance instead)
    Que je penses avoir résolu en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ip4 = pcs.packets.ipv4.ipv4()
    return ip4.ipv4_cksum(pkt)
    Mais j'ai alors le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "test2.py", line 49, in <module>
        p.construct()                     
      File "test2.py", line 40, in construct
        icmp6.checksum  = icmp6.cksum(ip6)
      File "/usr/lib/python2.7/dist-packages/pcs/packets/icmpv6.py", line 149, in cksum
        return ip4.ipv4_cksum(pkt)
    TypeError: ipv4_cksum() takes exactly 1 argument (2 given)
    Que je ne comprends pas puisque le nombre d'argument est correct. Je ne fais du python que depuis 1 semaine donc certaines chose m’échappent encore.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    J’ai pas le code de pcs.packets.ipv4 sous la main, mais il semblerait qu’il y manque le décorateur @static à la méthode ipv4_cksum()… :/

    En tout cas, la doc affirme que cette méthode est statique.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par mont29 Voir le message
    J’ai pas le code de pcs.packets.ipv4 sous la main, mais il semblerait qu’il y manque le décorateur @static à la méthode ipv4_cksum()… :/

    En tout cas, la doc affirme que cette méthode est statique.
    Ca ne met plus d'erreur quand j'ajoute @staticmethod devant la signature de la fonction. Merci infiniment, mais comment se fait il que je doive faire autant de modifications dans un module externe. Est-ce courant en python ?

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


    L'original du code déclare "ipv4_cksum" comme statique de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def ipv4_cksum(bytes):
            """Static method to: Calculate and return the IPv4 header checksum
               over the string of bytes provided."""
        ...
        ipv4_cksum = staticmethod(ipv4_cksum)
    La façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        @staticmethod
        def ipv4_cksum(bytes):
            """Static method to: Calculate and return the IPv4 header checksum
               over the string of bytes provided."""
        ...
    est équivalente.

    N'auriez vous pas par hasard modifié vous même le script "original"?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,


    L'original du code déclare "ipv4_cksum" comme statique de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def ipv4_cksum(bytes):
            """Static method to: Calculate and return the IPv4 header checksum
               over the string of bytes provided."""
        ...
        ipv4_cksum = staticmethod(ipv4_cksum)
    La façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        @staticmethod
        def ipv4_cksum(bytes):
            """Static method to: Calculate and return the IPv4 header checksum
               over the string of bytes provided."""
        ...
    est équivalente.

    N'auriez vous pas par hasard modifié vous même le script "original"?
    - W
    Merci pour l'info. Non j'ai rien toucher aux sources a part les modifications citées ci-dessus, j'avais même réinstallé le module pour être certain.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/03/2014, 22h41
  2. Selenium - AttributeError: 'module' object has no attribute
    Par bender1979 dans le forum Général Python
    Réponses: 4
    Dernier message: 09/11/2010, 22h03
  3. Probleme : AttributeError: 'tuple' object has no attribute
    Par MrGecko dans le forum Général Python
    Réponses: 1
    Dernier message: 27/05/2007, 09h59
  4. Réponses: 2
    Dernier message: 26/05/2006, 14h48

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