猿问

Ping多个ips并写入JSON文件python

我正在 ping LAN 中的多个 ip 以检查它是否处于活动状态。代码将根据计划每分钟运行一次。为了 ping 多个 ip,我使用了多处理。它在多处理的帮助下做得很好。同时,我想在ping后将ping结果写入json文件。但是写入JSON文件时,它只写入最后一个ip的输出。我想要所有三个。有没有办法做到这一点


这是示例代码:


import json

from multiprocessing import Pool

import subprocess

from datetime import datetime

timestamp = datetime.now().strftime("%B %d %Y, %H:%M:%S")

hosts =  ["192.168.1.47","192.168.1.42"]

count = 1

wait_sec = 1

n = len(hosts)

def main(hosts):

    p = Pool(processes= n)

    result = p.map(beat, hosts)

def beat(hosts):

    #Name for the log file

    name = 'icmp.json'

    ip4write(hosts, name)

def ip4write(hosts, name):

    global ip4a

    ip4a = hosts

    ipve4(hosts, name)

    write(hosts, name)

def ipve4(hosts, name):

    global u

    status, result = subprocess.getstatusoutput("ping -c1 -w2 " + str(ip4a))

    if status == 0:

        print(str(ip4a) + " UP")

        u = " UP"

def write(hosts, name):

    text_file = open(name, "a+")

    with open(name) as json_file:

      try:

          data = json.load(json_file)

      except:

          data = {}

      with open(name, 'w') as outfile:

        data[timestamp] = {

          'monitor.ip':str(hosts),

          'monitor.status': u

        }

        print(data)

        json.dump(data, outfile)

        print('Data written')

    text_file.close()

main(hosts)

JSON 文件中的输出:


{"February 15 2019, 16:38:12": {"monitor.status": " UP", "monitor.ip": "192.168.1.42"}}

我需要的输出:


{"February 15 2019, 16:38:12": {"monitor.ip": "192.168.1.47", "monitor.status": " UP"}, "February 15 2019, 16:38:12": {"monitor.ip": "192.168.1.42", "monitor.status": " UP"}}


海绵宝宝撒
浏览 202回答 2
2回答

慕慕森

要在不覆盖现有内容的情况下继续向现有文件添加内容,您应该以“追加”模式打开。在您的代码中,您以“写入”模式打开。这将打开文件进行写入,但会覆盖现有内容。具体来说,您的代码中的这一行:with open(name, 'w') as outfile:您应该将打开模式从 write ( 'w')更改为 append ( 'a')。with open(name, 'a') as outfile:如果这能解决您的问题,请告诉我。

万千封印

下面是代码的精简版:import osfrom multiprocessing import Poolimport jsonimport datetimeimport timehosts = ["192.168.1.47", "8.8.8.8"]MAX_NUMBER_OF_STATUS_CHECKS = 2FILE_NAME = 'hosts_stats.json'## counter and sleep were added in order to simulate scheduler activity&nbsp;&nbsp;#def ping(host):&nbsp; &nbsp; status = os.system('ping&nbsp; -o -c 3 {}'.format(host))&nbsp; &nbsp; return datetime.datetime.now().strftime("%B %d %Y, %H:%M:%S"), {"monitor.ip": host,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "monitor.status": 'UP' if status == 0 else 'DOWN'}if __name__ == "__main__":&nbsp; &nbsp; p = Pool(processes=len(hosts))&nbsp; &nbsp; counter = 0&nbsp; &nbsp; if not os.path.exists(FILE_NAME):&nbsp; &nbsp; &nbsp; &nbsp; with open(FILE_NAME, 'w') as f:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.write('{}')&nbsp; &nbsp; while counter < MAX_NUMBER_OF_STATUS_CHECKS:&nbsp; &nbsp; &nbsp; &nbsp; result = p.map(ping, hosts)&nbsp; &nbsp; &nbsp; &nbsp; with open(FILE_NAME, 'rb+') as f:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.seek(-1, os.SEEK_END)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.truncate()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for entry in result:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _entry = '"{}":{},\n'.format(entry[0], json.dumps(entry[1]))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.writelines(_entry)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f.write('}')&nbsp; &nbsp; &nbsp; &nbsp; counter += 1&nbsp; &nbsp; &nbsp; &nbsp; time.sleep(2)
随时随地看视频慕课网APP

相关分类

Python
我要回答