Python Forum
Appending a list in a class from a callback function
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Appending a list in a class from a callback function
#1
Hi all,
This is my first post. Usually I can search out answers to my problems but today I'm having a bit of difficulty finding what I'm doing wrong populating a list of MAC addresses from a callback function, all enclosed within a class. The list is always empty on the very last line where I print it out. If I print the contents of the list from within the callback function each time it is raised, it looks correct. I'm having a feeling it has to do with scope or might need a lambda function but I'm foggy on some aspects there. I apologize for my numerous un-pythonic statements. I'm totally self taught and come from using mainly Visual Basic so I can be a bit of a sloppy coder at times. Here's my code: NOTE: This is normally executed on a Raspberry Pi.

import nmap, sys, socket, subprocess

class IP_Roam():
    def __init__(self, root_ip="", display_on=False):
        self.mac_list = []
        self.display_on = display_on
        self.router_ip = root_ip
        self.end_ip = ""

    def callback_result(self, host, scan_result):
        if self.display_on:
            sys.stdout.write('\rScanning ' + str(host).ljust(15, ' '))
            sys.stdout.flush()

        for ip in scan_result['scan']:

            try:
                mac = scan_result['scan'][u'' + str(ip)]['addresses'][u'mac']
                if mac:
                    myscan.mac_list.append(mac)
                #ipv4 = scan_result['scan'][u'' + str(ip)]['addresses'][u'ipv4']
            except:
                # This happens when it finds itself
                pass

    def go(self):
        if self.router_ip == "":
            self.who_am_i()
        nma = nmap.PortScannerAsync()
        nma.scan(self.router_ip + "/24", arguments='-sP', callback=self.callback_result)

        while nma.still_scanning():
            nma.wait(2)

        if self.display_on:
            for mac in self.mac_list:
                print(mac)

    def who_am_i(self, ipend=None):
        my_ips = subprocess.check_output(("hostname", "-I"), stderr=None).decode('utf-8').split(" ")
        nodes = my_ips[0].split(".")
        self.router_ip = str(nodes[0]) + "." + str(nodes[1]) + ".1.0"

        if ipend is not None:
            self.end_ip = str(nodes[0]) + "." + str(nodes[1]) + ".1." + str(ipend)
            if self.display_on:
                print("Using: " + self.router_ip + "-" + self.end_ip)
        else:
            if self.display_on:
                print("Using: " + self.router_ip)

if __name__ == "__main__":
    myscan = IP_Roam(display_on=True)
    myscan.go()
    print(myscan.mac_list)
Reply
#2
Does
myscan.mac_list.append(mac)
need to be
self.mac_list.append(mac)
Think
Reply
#3
Actually, I originally had it that way with the same result. I changed it in hopes that it'd resolve the issue.
Reply
#4
I just changed it back to
self.mac_list.append(mac)
with no change. mac_list is still not populated when IP_Roam.go() completes.
Reply
#5
Having a try/except that excepts every exception and pass when there is an exception, will silently let any exception go by.
Reply
#6
I've simplified my question a bit here to see if anyone can help me with this. When I run the following IP Scan, the results print fine from within the callback function. The whole list will even appear if I do a print() of self.mac_list from within the callback function. However, when the routine terminates and go() returns self.mac_list it is always empty. Anyone know what I am missing here?

Thanks,
Jim
import nmap

class IP_Roam():
    def __init__(self, root_ip="", display_on=False):
        self.mac_list = []

    def callback_result(host, scan_result):
        print(scan_result)
        self.mac_list.append(scan_result)

    def go():
        nma = nmap.PortScannerAsync()
        nma.scan(hosts='192.168.1.0/30', arguments='-sP', callback=callback_result)

        while nma.still_scanning():
            print("Waiting >>>")
            nma.wait(2)   # you can do whatever you want but I choose to wait after the end of the scan
        return self.mac_list


if __name__ == "__main__":
    ps = IP_Roam()
    results = ps.go()
    print(results)
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  The function of double underscore back and front in a class function name? Pedroski55 9 562 Feb-19-2024, 03:51 PM
Last Post: deanhystad
  How to read module/class from list of strings? popular_dog 1 424 Oct-04-2023, 03:08 PM
Last Post: deanhystad
  TimeOut a function in a class ? Armandito 1 1,586 Apr-25-2022, 04:51 PM
Last Post: Gribouillis
  Calling a class from a function jc4d 5 1,755 Dec-17-2021, 09:04 PM
Last Post: ndc85430
  a function common to methods of a class Skaperen 7 2,499 Oct-04-2021, 07:07 PM
Last Post: Skaperen
  Class-Aggregation and creating a list/dictionary IoannisDem 1 1,883 Oct-03-2021, 05:16 PM
Last Post: Yoriz
  Tuple generator, and function/class syntax quazirfan 3 3,761 Aug-10-2021, 09:32 AM
Last Post: buran
  Time.sleep: stop appending item to the list if time is early quest 0 1,846 Apr-13-2021, 11:44 AM
Last Post: quest
  Reading and appending list MrSwiss 1 1,701 Mar-01-2021, 09:01 AM
Last Post: Serafim
  apendng to a list within a class gr3yali3n 4 2,291 Feb-16-2021, 06:30 AM
Last Post: buran

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020