Python 使用p.expect检索值

Python 使用p.expect检索值,python,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

我有一个程序可以登录到服务器并发出命令。结果将在脚本末尾打印出来。下面的代码显示了我为通过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
我想捕获打印出来的值

回答下面的问题。我想把“Value”作为变量,把“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

在这个问题上谁能帮忙。谢谢

您的意思是将其保存到文件中吗??那就试试这个

open("output.txt","w").write(results)
或者在命令行上运行脚本时:

$ python script.py > output.txt

否则,请定义“捕获”的含义。

您的意思是将其保存到文件吗??那就试试这个

open("output.txt","w").write(results)
或者在命令行上运行脚本时:

$ python script.py > output.txt

否则,定义“捕获”的含义是
值=1800
等。
结果的内容是什么?你想“捕捉”它吗

你的意思是要分析这些结果吗?或者作为python执行它们

如果前者你可以做一些类似的事情(未经测试,不干净,没有仔细处理空白):

这将为您提供一个可以使用的python字典。如果您知道值始终是数字,则可以使用
int(val)
float(val)
转换它们。。。(try…except会忽略格式不正确的行;可能有更可靠的方法可以做到这一点,例如,
如果行中的“=”


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

Value=1800
等。
结果的内容是什么?你想“捕捉”它吗

你的意思是要分析这些结果吗?或者作为python执行它们

如果前者你可以做一些类似的事情(未经测试,不干净,没有仔细处理空白):

这将为您提供一个可以使用的python字典。如果您知道值始终是数字,则可以使用
int(val)
float(val)
转换它们。。。(try…except会忽略格式不正确的行;可能有更可靠的方法可以做到这一点,例如,
如果行中的“=”


如果您真的希望最终得到一个名为Value、值为1800的变量,您可以使用
eval(results)
[或更安全的替代方法],尽管这需要先删除没有正确格式的行。

在每次调用
p.expect
后,返回匹配部分之前发出的子进程(任意数量的行)以及匹配的零件本身,都可以作为
p
前属性和
后属性访问,这就是您的“捕获”

也就是说,正如所说:

每次调用
expect()
之前的
后
和
之后
属性将设置为 由子应用程序打印的文本。
before
属性将包含所有 文本大小不超过预期的字符串 模式。
之后的
字符串将包含
与匹配的文本
预期模式。
匹配
属性 设置为re
MatchObject

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

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

每次调用
p.expect
返回后,无论匹配部分(任意行数)之前发出的子进程是什么,匹配部分本身都可以作为
p
before
before
属性进行访问——这就是您的“捕获”

也就是说,正如所说:

每次调用
expect()
之前的
后
和
之后
属性将设置为 由子应用程序打印的文本。
before
属性将包含所有 文本大小不超过预期的字符串 模式。
之后的
字符串将包含
与匹配的文本
预期模式。
匹配
属性 设置为re
MatchObject

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

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

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

for line in results:
    print line
    name, val = line.split(' = ') 
    results_dict[name] = val
如果它是您所认为的,那么这将起作用(现在在解释器中):


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

for line in results:
    print line
    name, val = line.split(' = ') 
    results_dict[name] = val
如果它是您所认为的,那么这将起作用(现在在解释器中):


啊,对不起,应该是
results.splitlines()
。但是如果您真的希望变量具有这些名称,
eval(results)
应该可以工作,如果这是真正的格式。啊,对不起,应该是
results.splitlines()
。但是如果您真的希望变量具有这些名称,
eval(results)
如果真是这样的格式,应该可以工作。问题是在我的解决方案中,我忘记了从
结果
生成行所需的“.splitlines()”。问题是在我的解决方案中,我忘记了从
结果
生成行所需的“.splitlines()”。