Получение значений с помощью p.expect - PullRequest
0 голосов
/ 18 января 2010

У меня есть программа, которая входит в систему на сервере и выдает команды. Результаты распечатываются в конце сценария. Приведенный ниже код показывает скрипт, который я создал для передачи команд через ssh.

import pexpect

ssh_newkey = 'Are you sure you want to continue connecting'
# my ssh command line
p=pexpect.spawn('ssh user@00.00.00.00')

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('user@hol-NA:')
    p.sendline("cd /opt/ad/bin")
    i=p.expect('user@hol-NA:')
    p.sendline("./ptzflip")
    i=p.expect('user@hol-NA:')
elif i==2:
    print "I either got key or connection timeout"
    pass
results = p.before # print out the result

print results

Результаты, которые распечатывает программа:

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

Я хочу получить распечатанные значения.

В ответ на вопросы ниже. Я хочу захватить, например. «Значение» в качестве переменной и «1800» в качестве значения. Я попытался выделить его в словаре, как указано ниже, но я получаю сообщение об ошибке. Когда я вхожу:

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

Я получаю сообщение об ошибке:

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

Когда я проверяю этот код в Python, он сохраняет эти значения в виде строки. Хранит его как:

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

Может кто-нибудь помочь в этой проблеме. Спасибо

Ответы [ 4 ]

1 голос
/ 18 января 2010

Являются ли Value = 1800 и т. Д. Содержимым results?И вы хотите «захватить» это?

Вы имеете в виду, что хотите проанализировать эти результаты?Или выполнить их как python?

Если в первом случае вы могли бы сделать что-то вроде (непроверенное, нечистое, не обрабатывает пробелы аккуратно):

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

Это дает вам словарь Python, которыйты можешь использовать.Если вы знаете, что значения всегда являются числами, вы можете преобразовать их с помощью int(val) или float(val) ... (попытка ... кроме игнорирует строки неправильной формы; могут быть более надежные способы сделать это, например,as if " = " in line)

Если вы действительно хотите получить переменную с именем Value со значением 1800, вы можете использовать eval(results) [или более безопасную альтернативу], хотя для этого потребуется удалить строки безсначала правильный формат.

1 голос
/ 18 января 2010

После каждого вызова p.expect все, что дочерний процесс выпустил непосредственно перед совпавшей частью (любое количество строк), и сама совпавшая часть, доступны как свойства before и after p - это ваш "захват" для вас!

То есть, как документы выразились:

После каждого звонка на expect() before и after свойства будут установлены в текст напечатан дочерним приложением. Свойство before будет содержать все текст до ожидаемой строки шаблон. Строка after будет содержать текст, который был сопоставлен с ожидаемая картина. match свойство установлен на MatchObject.

Пример кода в документации сразу после этой части может помочь понять это - после установления сеанса FTP с интерактивным ftp клиентом,

   child.sendline('ls /pub/OpenBSD/')
   child.expect('ftp> ')
   print child.before   # Print the result of the ls command.
1 голос
/ 18 января 2010

вы имеете в виду сохранить его в файл ?? тогда попробуйте это

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

или когда вы запускаете скрипт в командной строке:

$ python script.py > output.txt

в противном случае определите, что вы подразумеваете под "захватом"

0 голосов
/ 19 января 2010

Всякий раз, когда это происходит со мной, это потому, что строка, которую я разделяю, не имеет значения, которое я ожидал.Почему бы не взглянуть на это напрямую?

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

Если бы это было то, о чем вы думаете, это сработало бы (теперь в переводчике):

>>> 'Value = 1800'.split(' = ')
['Value', '1800']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...