Question

Je vous écris une bibliothèque pour le soutien telnet'ing à un serveur distant et en cours d'exécution des applications.

Les choses vont à merveille établir une connexion, d'obtenir des données de retour, l'analyse syntaxique, etc. (au moins aussi swimmingly que possible pour communiquer avec les programmes via une interface texte).

Une application va changer le curseur si elle pénètre correctement, ou laissez le curseur d'origine si elle échoue (je ne vous écris pas les applications, je viens de les utiliser.)

lorsque ladite application démarre correctement, cela fonctionne sans problème:

promptB = "hello(x)# "   # Yes, the space at the end is intentional
response = tn_conn.cmd("app_name\n", prompt=promptB)

Je voudrais utiliser le changement rapide (ou l'absence de changement rapide) pour détecter si le programme n'a pas pu démarrer. Je me suis dit que ce serait une occasion en or d'essayer telnetlib de s'attendre (), puisque expect () permet de passer d'une liste de chaînes pour correspondre à la réponse.

Je ne peux pas, cependant, obtenir ce travail:

promptA = "hello(x)# "   # Yes, the space at the end is intentional
promptB = "hello> "      # Yes, the space at the end is intentional

tn_conn.write("app_name\n")
which_prompt, mo, response = self.tn_conn.expect([promptA, promptB], timeout=3)

La commande toujours attendre fois sur, que ce soit à des applications commence ou non sucessfully.

= où "-1"

mo = Aucun

réponse = "mumble mumble \ r \ r \ n autres choses \ r \ n \ r \ nhello #"

Les docs disent que ce soit une chaîne ou un objet regex peuvent être passés à attendre (je passe une chaîne), de sorte que je manque quelque chose? Un regard sur le code de telnetlib montre que sa vocation re.search (), non re.match (), de sorte que ne semble pas être la question.

Quelqu'un peut-il vous plaît offre des suggestions sur ce que je fais mal?

Modifier Ajouté à parens l'exemple rapide pour mieux illustrer pourquoi attendre () ne fonctionnait pas comme prévu.

Était-ce utile?

La solution 3

Dans les précédentes tentatives, j'avais poursuivi l'option regex en plaçant .* aux deux extrémités de ma chaîne de recherche, ainsi que de faire un re.compile() à la chaîne de recherche avant / les transmettre à .expect(); tout avec pas de chance.

Merci à la suggestion de jathanism, je réexaminé en utilisant regex, cette fois avec la pensée que expect() était, euh ... attends « regex » où je pensais « string ».

Effectivement, il y avait des personnages dans ma chaîne rapide qui traitais comme attendre en symboles regex - () de pour être exact. Echapper à la parens laisser expect() faire son travail.

Autres conseils

Ne pas oublier si vous utilisez l'expression régulière en python, vous pouvez toujours utiliser la méthode brute (r'my string') plutôt que d'ajouter dans toutes les échappées; rend plus lisible.

Je suis quelque chose à travailler. Vous recherchez ou #% ou $ invites. En ce qui concerne vos invites, assurez-vous que les caractères spéciaux sont échappés. (). Peut-être échapper EVERTHING juste pour être sûr.

idx, obj, response = tn_conn.expect("\#","\%","\$",3)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top