2010-01-18 5 views
0

J'ai un programme qui se connecte à un serveur et émet des commandes. Les résultats sont imprimés à la fin du script. Le code ci-dessous montre le script que j'ai créé pour passer des commandes via ssh.Récupération de valeurs avec p.expect

import pexpect 

ssh_newkey = 'Are you sure you want to continue connecting' 
# my ssh command line 
p=pexpect.spawn('ssh [email protected]') 

i=p.expect([ssh_newkey,'password:',pexpect.EOF]) 
if i==0: 
    print "I say yes" 
    p.sendline('yes') 
    i=p.expect([ssh_newkey,'password:',pexpect.EOF]) 
if i==1: 
    print "I have entered the password. I will now flip camera through ", 
    p.sendline("user") 
    i=p.expect('[email protected]:') 
    p.sendline("cd /opt/ad/bin") 
    i=p.expect('[email protected]:') 
    p.sendline("./ptzflip") 
    i=p.expect('[email protected]:') 
elif i==2: 
    print "I either got key or connection timeout" 
    pass 
results = p.before # print out the result 

print results 

Les résultats que le programme imprime est:

Value = 1800 
Min = 0 
Max = 3600 
Step = 1 

Je veux capturer les valeurs qui sont imprimées.

En reponse aux questions ci-dessous. Je veux capturer par exemple. «Valeur» en tant que variable et «1800» en tant que valeur. J'ai essayé de le séparer dans un dictionnaire comme mentionné ci-dessous mais j'ai une erreur. Quand je rentre:

results_dict = {} 
for line in results: 
    name, val = line.split(' = ') 
    results_dict[name] = val 

Je reçois une erreur:

Traceback (most recent call last): 
    File "ptest.py", line 30, in <module> 
    name, val = line.split(' = ') 
ValueError: need more than 1 value to unpack 

Quand je vérifie ce code en Python stocke ces valeurs en tant que chaîne. Il le stocke comme:

'/opt/ad/bin$ ./ptzflip\r\nValue = 1800\r\nMin = 0\r\nMax = 3600\r\nStep = 1\r\n' 

Quelqu'un peut-il aider dans ce problème. Voulez-vous dire l'enregistrer dans un fichier?

+0

ah, désolé, il aurait dû être 'results.splitlines()'. Mais si vous voulez vraiment que les variables aient ces noms, 'eval (results)' devrait fonctionner si c'est vraiment le format. –

Répondre

1

sont-Value = 1800 etc. le contenu de results ? Et vous voulez "capturer" cela?

Voulez-vous dire que vous voulez analyser ces résultats? Ou les exécuter en python?

Si l'ancien, vous pouvez faire quelque chose comme (non testé, impur, ne traite pas bien avec les espaces):

results_dict = {} 
for line in results.splitlines(): 
    try: 
     name, val = line.split(' = ') 
    except ValueError: 
     continue 
    results_dict[name] = val 

Cela vous donne un dictionnaire python que vous pouvez utiliser. Si vous savez que les valeurs sont toujours des nombres, vous pouvez les convertir avec int(val) ou float(val) ... (L'essai ... sauf ignore les lignes de la forme incorrecte, il peut y avoir des moyens plus robustes de le faire, comme if " = " in line)

Si vous voulez réellement vous retrouver avec une variable nommée Value avec la valeur 1800, vous pouvez utiliser eval(results) [ou une alternative plus sûre], bien que cela doive d'abord supprimer les lignes sans le bon format.

1

essayez cette

open("output.txt","w").write(results) 

ou lorsque vous exécutez le script sur la ligne de commande:

$ python script.py > output.txt 

autrement, définir ce que vous entendez par "capture"

1

Après chaque appel à p.expect rendement, quel que soit le processus d'enfant émis juste avant la partie adapté (un certain nombre de lignes), et la partie adaptée lui-même, sont accessibles comme les before et after propriétés de p - c'est votre « capture " pour toi!

I.e., Comme the docs mettre:

After each call to expect() the before and after properties will be set to the text printed by child application. The before property will contain all text up to the expected string pattern. The after string will contain the text that was matched by the expected pattern. The match property is set to the re MatchObject .

Le code exemple dans la documentation juste après cette partie peut être utile de comprendre - après avoir établi une session FTP avec le ftp interactif client,

child.sendline('ls /pub/OpenBSD/') 
    child.expect('ftp> ') 
    print child.before # Print the result of the ls command. 
0

Chaque fois que Cela m'arrive, c'est parce que la chaîne que je coupe n'a pas la valeur que j'attendais. Pourquoi ne pas le regarder directement?

for line in results: 
    print line 
    name, val = line.split(' = ') 
    results_dict[name] = val 

Si c'était ce que vous pensez qu'il est, cela fonctionnerait (maintenant dans l'interpréteur):

>>> 'Value = 1800'.split(' = ') 
['Value', '1800'] 
+0

Le problème est que dans ma solution j'avais oublié le ".splitlines()" requis pour faire des lignes de 'results'. –

Questions connexes