我有一个登录服务器并发出命令的程序。结果将在脚本末尾打印出来。下面的代码显示了我创建的用于通过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'
任何人都可以帮助解决这个问题。感谢
答案 0 :(得分:1)
你的意思是把它保存到文件?然后尝试这个
open("output.txt","w").write(results)
或在命令行上运行脚本时:
$ python script.py > output.txt
否则,通过“捕获”来定义你的意思
答案 1 :(得分:1)
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)
转换它们...(尝试...除了忽略不正确形式的行;可能有更强大的方法这样做,例如if " = " in line
)
如果您确实想要使用值为1800的名为Value的变量,那么可以使用eval(results)
[或更安全的替代方法],尽管这需要先删除没有正确格式的行。
答案 2 :(得分:1)
每次调用p.expect
后,无论在匹配的部分(任意数量的行)之前发出的子进程,以及匹配的部分本身,都可以作为before
和{{1 after
的属性 - 这是你的“捕获”!
即,正如the docs所说:
每次致电
p
expect()
后 和before
属性将设置为 儿童申请书印刷的文字。after
属性将包含所有内容 文本到期望的字符串 图案。before
字符串将包含 与之匹配的文本 预期模式。after
属性 设置为rematch
。
本部分之后的文档中的示例代码有助于理解这一点 - 在与交互式MatchObject
客户端建立FTP会话后
ftp
答案 3 :(得分:0)
每当这发生在我身上时,这是因为我正在拆分的字符串没有我期望的值。为什么不直接看呢?
for line in results:
print line
name, val = line.split(' = ')
results_dict[name] = val
如果它是您认为的那样,这将起作用(现在在解释器中):
>>> 'Value = 1800'.split(' = ')
['Value', '1800']