使用p.expect检索值

时间:2010-01-18 17:13:05

标签: python

我有一个登录服务器并发出命令的程序。结果将在脚本末尾打印出来。下面的代码显示了我创建的用于通过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 个答案:

答案 0 :(得分:1)

你的意思是把它保存到文件?然后尝试这个

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

或在命令行上运行脚本时:

$ python script.py > output.txt

否则,通过“捕获”来定义你的意思

答案 1 :(得分:1)

Value = 1800results的内容是?而你想“捕获”那个?

你的意思是你要解析那些结果吗?或者将它们作为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)转换它们...(尝试...除了忽略不正确形式的行;可能有更强大的方法这样做,例如if " = " in line

如果您确实想要使用值为1800的名为Value的变量,那么可以使用eval(results) [或更安全的替代方法],尽管这需要先删除没有正确格式的行。

答案 2 :(得分:1)

每次调用p.expect后,无论在匹配的部分(任意数量的行)之前发出的子进程,以及匹配的部分本身,都可以作为before和{{1 after的属性 - 这是你的“捕获”!

即,正如the docs所说:

  

每次致电p expect()后   和before属性将设置为   儿童申请书印刷的文字。   after属性将包含所有内容   文本到期望的字符串   图案。 before字符串将包含   与之匹配的文本   预期模式。 after属性   设置为re match

本部分之后的文档中的示例代码有助于理解这一点 - 在与交互式MatchObject客户端建立FTP会话后

ftp

答案 3 :(得分:0)

每当这发生在我身上时,这是因为我正在拆分的字符串没有我期望的值。为什么不直接看呢?

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

如果它是您认为的那样,这将起作用(现在在解释器中):

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