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 :

Gestion KeyError pour ne pas bloquer le code


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur Sécurité et Réseau
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur Sécurité et Réseau

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut Gestion KeyError pour ne pas bloquer le code
    Bonjour,

    Je tente de faire un petit script pour faire un inventaire à partir de 2 commande avec un retour en JSON. Puis envoyer le JSON dans splunk

    Pour l'instant je n'ai pas encore regarder pour construire un JSON à partir de mes 2 retours commande. La partie envoie SPLUNK je l'ai déja fait, donc j'ai le bout de code qui va bien.

    Par moment j'ai des interfaces n'ayant pas de description, aussi quand je tape ma commande, la clef "desc" n''est pas présente.

    Et donc j'ai une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    connect : xxxxx
    {"device": "switch_1", "interface": "Ethernet1/1", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/2", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/3", "description": "xxxxxx"}
    Traceback (most recent call last):
      File "test_mac_inv.py", line 51, in <module>
        desc = items["desc"]
    KeyError: 'desc
    J'ai bien tenté d'utiliser items.get, mais toujours la même erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    desc = items.get("desc")
    desc = items.get("desc", '')

    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
    27
    28
    29
    IP =  ["xxx.xxx.xxx.xxx"]
    #SSH INIT
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     
    username = "xxxxxx"
    password = "xxxxxxx"
    port = 22
     
    for swi in IP:
            Connection = "connect : " + swi
            print Connection
    #GET hostname
            ssh.connect(swi, port, username, password, look_for_keys=False)
            stdin,stdout,stderr = ssh.exec_command('show hostname ')
            host = str(stdout.readlines()[0].strip())
    #GET desc
            ssh.connect(swi, port, username, password, look_for_keys=False)
            stdin,stdout,stderr = ssh.exec_command('show interface description | json ')
            output = stdout.readlines()
     
            #GET OUTPUT
            JSON_DATA = json.loads('\n'.join(output))
     
            for items in JSON_DATA["TABLE_interface"]["ROW_interface"]:
                 interface = items["interface"]
                 desc = items["desc"]
                 Cisco_Inventory = { "device" : host, "interface" : str(items["interface"]), "description" : str(items["desc"])}
                 print Cisco_Inventory

    Merci par avance

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    La métode get d'un dictionnaire ne peut pas retourner une erreur: elle retourne une valeur par défaut (None ou autre si spécifié) si la clé n'existe pas.

    1) Etes vous sûr que c'est exactement la même erreur ? Ou bien c'est une autre erreur ?
    2) Avant la boucle for, si vous faites un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(JSON_DATA["TABLE_interface"]["ROW_interface"])
    ca donne quoi ?

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur Sécurité et Réseau
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur Sécurité et Réseau

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    La métode get d'un dictionnaire ne peut pas retourner une erreur: elle retourne une valeur par défaut (None ou autre si spécifié) si la clé n'existe pas.

    1) Etes vous sûr que c'est exactement la même erreur ? Ou bien c'est une autre erreur ?
    2) Avant la boucle for, si vous faites un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(JSON_DATA["TABLE_interface"]["ROW_interface"])
    ca donne quoi ?

    Alors le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(JSON_DATA["TABLE_interface"]["ROW_interface"])
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    {u'TABLE_interface': {u'ROW_interface': [
     {u'interface': u'Ethernet1/1', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/2', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/3', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/4', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/5', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/6', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/7', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/8', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/9', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/10', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/11', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/12', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/13', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/14', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/15', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/16', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/17', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/18', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/19', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/20', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/21', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/22', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/23', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'Ethernet1/24', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/25', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/26', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/27', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/28', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/29', u'speed': u'10G', u'type': u'eth', u'desc'xxxxxx'},
     {u'interface': u'Ethernet1/30', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/31', u'speed': u'10G', u'type': u'eth'},
     {u'interface': u'Ethernet1/32', u'speed': u'10G', u'type': u'eth', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel1', u'desc': u'xxxxxx'}, {u'interface': u'port-channel2', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel3', u'desc': u'xxxxxx'}, {u'interface': u'port-channel4', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel5', u'desc': u'xxxxxx'}, {u'interface': u'port-channel6', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel7', u'desc': u'xxxxxx'}, {u'interface': u'port-channel8', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel9', u'desc': u'xxxxxx'}, {u'interface': u'port-channel10', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel11', u'desc': u'xxxxxx'}, {u'interface': u'port-channel12', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel14', u'desc': u'xxxxxx'}, {u'interface': u'port-channel15', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel16', u'desc': u'xxxxxx'}, {u'interface': u'port-channel17', u'desc': u'xxxxxx'},
     {u'interface': u'port-channel1000', u'desc': u'xxxxxx'}, {u'interface': u'xxxxxx'},
     {u'interface': u'xxxxxx', u'desc': u'xxxxxx'}, {u'interface': u'xxxxxx'}]}}

    L'erreur suite à item.get

    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
    Connection a : xxxxxxxx
    {"device": "switch_1", "interface": "Ethernet1/1", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/2", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/3", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/4", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/5", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/6", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/7", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/8", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/9", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/10", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/11", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/12", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/13", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/14", "description": "xxxxxx"}
    {"device": "switch_1", "interface": "Ethernet1/15", "description": "xxxxxx"}
    Traceback (most recent call last):
      File "test_mac_inv.py", line 53, in <module>
        Cisco_Inventory = { "device" : host, "interface" : str(items["interface"]), "description" : str(items["desc"])}
    KeyError: 'desc'

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

    Citation Envoyé par popps Voir le message
    L'erreur suite à item.get
    Dans le traceback de l'erreur, l'instruction est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Cisco_Inventory = { "device" : host, "interface" : str(items["interface"]), "description" : str(items["desc"])}"
    où il n'y a ni item ni item.get...

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

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Ligne 25 de votre print des données, on voit que l'item

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {u'interface': u'Ethernet1/24', u'speed': u'10G', u'type': u'eth'},
    n'a pas le champ u'desc', donc sans utiliser la méthode get pour spécifier une valeur par défaut, ca ne peut fonctionner.

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/07/2019, 09h42
  2. Réponses: 0
    Dernier message: 23/07/2019, 09h42
  3. Réponses: 3
    Dernier message: 27/11/2014, 10h15
  4. Comment faire pour ne pas bloquer l'EDT?
    Par allouchi dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 20/07/2009, 22h00
  5. [XL-97] UserForm : comment ne pas bloquer le code appelant?
    Par Penegal dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 17/04/2009, 15h35

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