大佬们,请教一个小问题?用Paramiko做了一个远程函数,登录设备后将回显的数据(或报文)写入到txt中,遇到的问题是是目前只能做到等待与服务socket断开连接时,才能将数据写入到文本文件里,能不能做到append的数据为空或者该data数据长时间未更新(3秒、10秒左右),跳出循环,执行下一步
with open(Name + '.txt', 'w') as config :
total_data = []
while True :
data = cli.recv(65535).decode('ASCII').replace('\r', '')
if not data :
break # 检查收到的 data 是否为空,如果是,则跳出循环。
total_data.append(data)
# print(data)
config.writelines(total_data) # 将字符串列表写入文件中
ssh.close() # 关闭ssh连接
用代码块功能插入代码,请勿粘贴截图
目前可以正常运行,但需等待与服务socket断开连接(时间过长)才能执行下一步
使用基础数据接收法时,当与服务socket断开连接时,会接收到空字符串。因此,可以根据此特点,在程序中加入循环,一直接收数据,直到数据发送端关闭socket连接。适用场景:客户端和服务器的链接为短链接(即一次socket通讯后连接就会关闭)。代码如下:
import socket,struct,sys,time
Port=22220
#assume a socket disconnect (data returned is empty string) means all data was #done being sent.
def recv_basic(the_socket):
total_data=[]
while True:
data = the_socket.recv(20480)
if not data: break
total_data.append(data)
return ''.join(total_data)
数据一段时间未更新后跳出循环,执行下一步
可以使用eventlet模块,进行超时跳过,代码修改如下:
import eventlet #导入eventlet这个模块
eventlet.monkey_patch() #必须加这条代码
with open(Name + '.txt', 'w') as config:
total_data = []
while True:
flag = True
with eventlet.Timeout(3, False): # 设置超时时间为3秒,就跳过
data = cli.recv(65535).decode('ASCII').replace('\r', '')
# 没有超时flag会为False,超时flag为True
flag = False
if flag:
break
if not data:
break # 检查收到的 data 是否为空,如果是,则跳出循环。
total_data.append(data)
config.writelines(total_data) # 将字符串列表写入文件中
ssh.close() # 关闭ssh连接
eventlet示例代码
import time
import eventlet #导入eventlet这个模块
eventlet.monkey_patch() #必须加这条代码
with eventlet.Timeout(2,False): #设置超时时间为2秒
print ('这条语句正常执行')
time.sleep(4)
print ('没有跳过这条输出')
print('跳过了输出')
改动如下:
with open(Name + '.txt', 'w') as config:
total_data = []
while True:
b_size = 65535
data = cli.recv(b_size).decode('ASCII').replace('\r', '')
total_data.append(data)
if len(data) < b_size:
break
# print(data)
config.writelines(total_data) # 将字符串列表写入文件中
ssh.close() # 关闭ssh连接
我之前写过一个类似的,你可以看看