Python 使用p.expect检索值
我有一个程序可以登录到服务器并发出命令。结果将在脚本末尾打印出来。下面的代码显示了我为通过ssh传递命令而创建的脚本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
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
属性将包含所有
文本大小不超过预期的字符串
模式。
之后的字符串将包含
与匹配的文本
预期模式。匹配
属性
设置为reMatchObject
本部分后面文档中的示例代码有助于理解这一点——在与交互式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
属性将包含所有
文本大小不超过预期的字符串
模式。
之后的字符串将包含
与匹配的文本
预期模式。匹配
属性
设置为reMatchObject
本部分后面文档中的示例代码有助于理解这一点——在与交互式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()”。