Python multiprocessing object throwing 'NoneType' Exception even though it is not None

Viewed 693

I'm using a python script to perform asynchronous Nmap scans with the python-nmap v0.6.1 library and Python v3.8.3. When I follow the simple asynchronous example displayed on the page, the scan completes successfully but prints the following "Exception ignored" message.

Exception ignored in: <function PortScannerAsync.__del__ at 0x000001B88EE40430>
Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\nmap\nmap.py", line 741, in __del__
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1008.0_x64__qbz5n2kfra8p0\lib\multiprocessing\process.py", line 133, in terminate
AttributeError: 'NoneType' object has no attribute 'terminate'

I looked into the PortScannerAsync object's __del__ method (line 741 in the library file) and found that two checks were being performed before calling terminate. Here is the snippet in question:

def __del__(self):
    """
    Cleanup when deleted

    """
    if self._process is not None:
        try:
            if self._process.is_alive():
                self._process.terminate() #this is line 741
        except AssertionError:
            # Happens on python3.4
            # when using PortScannerAsync twice in a row
            pass

    self._process = None
    return

So the library should be confirming:

(1) self._process is not None

(2) self._process_is_alive() returns true before calling terminate.

To make sure nothing weird was happening with the object in question, I added the following print lines to run right before the terminate method (line 741):

print(type(self._process)) print(dir(self._process))

The Exception is still printed even though the print methods I added confirms that:

(1) it is a multiprocessing Process object: (<class 'multiprocessing.context.Process'>) and

(2) it has a terminate method: (['_Popen', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_args', '_bootstrap', '_check_closed', '_closed', '_config', '_identity', '_kwargs', '_name', '_parent_name', '_parent_pid', '_popen', '_start_method', '_target', 'authkey', 'close', 'daemon', 'exitcode', 'ident', 'is_alive', 'join', 'kill', 'name', 'pid', 'run', 'sentinel', 'start', 'terminate'])

--

Am I missing something obvious? I am new to multiprocessing in python so I am not sure if I am lacking any required components.

Here is the full script:

import nmap
nma = nmap.PortScannerAsync()

def callback_result(host, scan_result):
    print('---')
    print(host, scan_result)

if __name__ == '__main__':
    nma.scan(hosts='10.0.0.69', arguments='-sn', callback=callback_result)
    while nma.still_scanning():
        print('waiting....')
        nma.wait(2)
0 Answers
Related