Skip to main content
 首页 » 编程设计

python之在 for 循环中重用变量,在 next for 循环中

2025年05月04日21me-sa

我正在学习 Python,并且正在学习基础知识。现在,代码的主要目标是使用 SSH(在本例中使用 Paramiko)自动执行任务,之后执行一些不相关的操作,然后再次在相同设备上执行任务,但不设置新 session 。 Paramiko 部分有效,代码适用于单个设备但现在我被卡住了。假设我有以下内容:

for host in hosts: 
  sshclient = paramiko.SSHClient() 
  sshclient.connect(host, port=22, username=user, password=password) 
  cmd = sshclient.invoke_shell() 

所以这将遍历主机列表并连接到设备。但是现在,稍后在代码中,在这个 for 循环之外,我需要另一个循环来向所有设备发送命令,例如:

for some in data: 
  cmd.send("some command") 

但是当我这样做时,它只使用它连接的最后一个主机,因为在第一个 for 循环中声明并记住了 cmd 变量。我可以通过在后者 for 循环中设置一个新的“连接”来解决这个问题,但是 Paramiko 构建了一个 session ,并且列表中的迭代次数太多, session 数变得太大。所以我想重用 cmd 变量并在每个 session 的第一个 for 循环中创建新变量(?),还是我的想法完全错误?

谁能帮我解决这个问题?

非常感谢。

请您参考如下方法:

您可以将所有 cmd 变量聚合到一个 list 中,以便稍后循环:

cmds = [] 
 
for host in hosts: 
  sshclient = paramiko.SSHClient() 
  sshclient.connect(host, port=22, username=user, password=password) 
  cmds.append(sshclient.invoke_shell()) 
 
# Now you can iterate over them 
for cmd in cmds: 
    cmd.send("some command") 

如果您担心同时打开的连接数,您可以根据需要生成它们:

def create_cmds(hosts): 
    for host in hosts: 
        sshclient = paramiko.SSHClient() 
        sshclient.connect(host, port=22, username=user, password=password) 
        yield sshclient 
        sshclient.close() # close invoked here automatically on call to next() with for loop 
 
for client in create_cmds(hosts): 
    cmd = client.invoke_shell() # an open method was called here 
    cmd.send('some command') 

如前所述here您将需要调用 client.close 以防止出现奇怪的关闭错误