Forum Programmation.python pexpect, retrouver l'élément attendu

Posté par  .
Étiquettes : aucune
1
16
juil.
2010
Bonjour,

J'utilise pexpect afin d'interagir en fonction des retours par exemple pour une session SSH, Telnet, etc...

J'ai une méthode qui exécute une commande et renvoi le résultat.

def run(self, command):
out = []
self.child.sendline(command)
ret = self.child.expect(self.prompt)
if ret == 0:
for line in re.split('\n', self.child.before):
re.sub('\s*$', '', line)
out.append(line)
out.pop(0)
out.pop(len(out) - 1)
return out


Rien de bien extraordinaire, j'exécute le commande et après avoir nettoyé le résultat, je place chaque ligne dans une liste.

Ce que je voudrais, c'est d'ajouter un paramètre où l'utilisateur (de la fonction) pourrait attendre autre chose que le prompt et spécifier l'action à effectuer.

Par exemple si je doit lancer une commande qui attend une réponse, j'aurai un timeout car pas de prompt.

Le but du jeu étant donc d'avoir soit dans un dictionnaire ou dans une liste les étapes intermédiaires avant d'arriver au prompt. Et bien sûre, tout en sauvegardant le résultat au fur et à mesure.


Première solution, l'usage d'un dictionnaire. Les clés serait ce que l'on attend et la valeur, la ligne à exécuter.

Ma ligne :
ret = self.child.expect(self.prompt)
deviendrait alors :
ret = self.child.expect([self.prompt, dict.keys()])

La fonction expect renvoi un entier. Ce dernier correspond à l'indice de l'élément trouvé. Comment puis-je faire la relation entre indice et valeur de clé ?


La deuxième solution serait d'utiliser une liste contenant des paires :
[('attente1', 'envoi1'), ('attente2', 'envoi2'), ...]

Mais là, pour extraire chaque attente il faudra faire une boucle. Ensuite la correspondance avec la valeur de retour est plus simple.
envoi = liste[ret - 1][1]

Qu'en pensez-vous ?
  • # liste intermédiaire

    Posté par  . Évalué à 4.

    Comment puis-je faire la relation entre indice et valeur de clé ?

    tu ne peux pas le faire directement parce qu'il dict.keys() n'est pas ordonnée.

    Tu peux t'en sortir en faisant :
    tmp = dict.keys()
    ret = self.child.expect([self.prompt, tmp])

    du coup, dict[tmp[ret]] devrait contenir ce qui t'intéresse

    à noter que dict n'est pas un nom de variable très judicieux :)
    • [^] # Re: liste intermédiaire

      Posté par  . Évalué à 2.

      à noter que dict n'est pas un nom de variable très judicieux :)

      Oui, c'était simplement pour l'exemple.
    • [^] # Re: liste intermédiaire

      Posté par  . Évalué à 2.

      Merci, ça passe parfaitement.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.