字典元素的多处理



目标:

  1. ssh到excel文件中列出的每个设备,执行命令,捕获输出并以表格格式显示输出(输出表a列:设备名称,B列:命令输出(
  2. 使用多处理优化处理时间以扩展100秒的设备

到目前为止,我可以使用以下代码实现这一点,但我觉得应该有更好的方法来实现这一目标。参考

问题说明:

  1. 我的输入是一个字典而不是列表,作为一种变通方法,我在下面的代码中将其转换为列表
  2. 目标函数需要字典元素作为输入
  3. 每个进程的输出(switchname和命令输出(应该返回到主进程以形成数据帧

excel文件中的样本表

DeviceName DeviceIP地址
路由器1121 192.168.1.1
路由器1122 192.168.1.2
路由器1131 192.168.1.3
路由器1132 192.168.1.4

我能够通过使用多处理的Pool类找到另一种更好的方法来实现目标。

import multiprocessing
import paramiko
from collections import defaultdict
import pandas as pd
import stdiomask
ssh = paramiko.SSHClient()
def connect_device(admin_username, admin_password, devicename, ipaddress):
devicename = mylist[1]['DeviceName']
ipaddress = mylist[1]['DeviceIPaddress']
print(f"Trying to connect to {devicename}")

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ipaddress, port=22, allow_agent=False, username=admin_username, password=admin_password)
print(f"Connection established to {devicename}")
command = "show interface description | i Gi1/0/23"
stdin, stdout, stderr = ssh.exec_command(command)
out = stdout.read()
ssh.close()
return devicename, out
if __name__ == '__main__':

df = exceltodataframe('Deviceinfo.xlsx', 'Devicedetails')
# create dictionaries from the dataframes
dfdict = df.T.to_dict()
mylist = list(dfdict.items())
admin_username = input("Enter the username: ")
admin_password = stdiomask.getpass("Enter the password: ")
p = multiprocessing.Pool()
result = p.map(connect_device, mylist)
def_dct_all = defaultdict(dict)

for r in range(len(result)):
def_dct_all[r]['DeviceName'] = result[r][0]
def_dct_all[r]['Description'] = result[r][1].decode("utf-8").rstrip()
resultdf = pd.DataFrame(def_dct_all).T
print(resultdf)

相关内容

  • 没有找到相关文章

最新更新