TypeError 仅在 Linux 上执行时出现,在 Windows 上运行完美

TypeError only appears when executed on Linux, works perfectly fine on Windows

所以我在 windows 上创建了这个 python 文件:

import sqlite3
import getmac
import nmap

nm = nmap.PortScanner()
prevAmount = 0

while True:
    nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
    hosts_list = nm.all_hosts()
    hosts_list.remove('192.168.1.1')
    print(hosts_list)
    if len(hosts_list) > prevAmount:
        for host in hosts_list:
            mac = getmac.get_mac_address(ip=host)
            connection = sqlite3.connect('OpenSesame.db')
            cursor = connection.cursor()
            cursor.execute("SELECT EXISTS(SELECT 1 FROM tblDevices WHERE DeviceMAC ='" + mac + "');")
            bExists = cursor.fetchone()
            if bExists[0] == 1:
                cursor.execute("SELECT DeviceName FROM tblDevices WHERE DeviceMAC ='" + mac + "';")
                persoon = cursor.fetchone()
                print(persoon[0])
        prevAmount = len(hosts_list)
    elif len(hosts_list) < prevAmount:
        prevAmount = 0

我目前无法在 Raspberry Pi 上实现它,显然 运行 Linux。 我得到的完整输出是:

['192.168.1.17', '192.168.1.55', '192.168.1.56', '192.168.1.59', '192.168.1.70']
Traceback (most recent call last):
  File "RelayOpenSesame.py", line 19, in <module>
    cursor.execute("SELECT EXISTS(SELECT 1 FROM tblDevices WHERE DeviceMAC ='" + mac + "');")
TypeError: can only concatenate str (not "NoneType") to str

这只发生在 Linux,而不是 windows。 我还注意到,当将设备连接到实际上在数据库中的网络时,它会打印出名称,这是由第 23 行完成的:print(persoon[0]) 因此,程序运行到导致错误的第 19 行,并且可能仅在最后一行之后抛出停止程序的错误。

知道为什么会这样吗?

从评论中可以清楚地看出 - 问题出在 host/local ip getmac.get_mac_address() returns None 上。我还在 Linux 上确认了这一点。 看着this issue - it's known bug/limitation of the package - it does not work for host ip on Linux。查看讨论以获取更多信息。 不过,您可以使用本地接口名称。