gpt4 book ai didi

python - 在Python中,for循环一个文件来搜索另一个文件

转载 作者:行者123 更新时间:2023-12-01 04:48:16 25 4
gpt4 key购买 nike

希望得到一些关于如何增强我的 python 脚本来解决问题的线索。我有一个文件,其中列出了数千个移动工作站和 IP 地址,每五分钟更新一次。我使用 Paramiko 通过 ssh 连接到每个工作站,以验证服务是否正在运行(在本例中为 crond)。我遇到的问题是,当我启动 python 脚本时,它会将大文件读取到内存中,当它读取到 1/3 时,IP 地址已更改,并且大部分 IP 地址不再有效。有没有办法让 python 在工作站每次搜索之前打开然后关闭文件?这将确保 IP 是当前 IP。我在下面编写的 python 脚本可以工作,但我再次遇到旧 IP 信息的问题。谢谢。

The contents of WKSIPS.txt are in the format:

WORK 1234 Cell IP: 10.10.10.10
WORK 4567 Cell IP: 10.10.10.11

#!/usr/bin/python
import paramiko, os, string, threading
import getpass
import socket
import sys

FileName=open('WKSIPS.txt', 'r')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for line in FileName.readlines():
WKSid = line.split()
try:
if WKSid[0] == 'WORK' :
WKSip = WKSid[4]
ssh.connect(WKSip, username='user', password='password', timeout='3')
stdin, stdout, stderr = ssh.exec_command('service crond status')
Out = stdout.readlines()
print ("WORK " + WKSid[1], Out)
ssh.close()
FileName.close
except paramiko.SSHException, e:
print ('WORK' + WKSid, WKSip, "Invalid Password")

最佳答案

我建议使用 multiprocessing pool创建可以为您处理文件每一行的工作程序,这将使您能够更快地浏览文件。

我使用此代码片段的目标是通过使脚本足够快以在 5 分钟文件刷新之前完成来完全回避文件重新加载问题

#!/usr/bin/python

import paramiko, os, string, threading
import multiprocessing
import getpass
import socket
import sys

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def worker(line)
WKSid = line.split()
try:
if WKSid[0] == 'WORK' :
WKSip = WKSid[4]

ssh.connect(WKSip, username='user', password='password', timeout='3')
stdin, stdout, stderr = ssh.exec_command('service crond status')
Out = stdout.readlines()
print ("WORK " + WKSid[1], Out)
ssh.close()
except paramiko.SSHException, e:
print ('WORK' + WKSid, WKSip, "Invalid Password")

# set up processing pool
pool = multiprocessing.Pool()

with open('WKSIPS.txt') as infile:
pool.map(worker, infile)

pool.close()
pool.join()

注释:

  • 我已将脚本功能的主要部分移至一个接受文件行作为输入的函数中。 pool.map() 将为每个工作人员提供文件迭代器的一行,他们将独立处理它。它与您的原始代码执行相同的操作,但工作被分配给多个进程,这些进程的数量等于您计算机上的核心数量。
  • 我没有 paramiko 模块,无法在当前环境中安装它,因此我无法真正为您测试此代码。如果有任何错误,我提前表示歉意。
  • 我对 paramiko 库不熟悉,因此在多个进程中同时使用相同的 paramikio.SSHClient() 对象可能会产生一些隐藏的副作用。如果您在 ssh 对象中看到奇怪的错误,请尝试将其实例化到辅助函数中。
  • 我已将 readlines() 更改为使用 Python 文件迭代器。将整个文件读入内存是一项耗时的操作,应该避免。

需要明确的是,此代码片段处理文件运行时发生的更改。我做了两个大假设:

  1. 此脚本的执行可以与刷新文件的任何操作同步,以便在刷新文件后立即执行。
  2. 它可以在 5 分钟内执行 - 因为我没有 paramiko,无法访问 ssh 目标,也没有访问 WKSIPS.txt,所以我无法计时。由于这个问题似乎符合 embarassingly parallel 的定义,我认为值得一试。如果不符合时间规范,将由OP进一步优化。

关于python - 在Python中,for循环一个文件来搜索另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28972545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com