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。查看讨论以获取更多信息。
不过,您可以使用本地接口名称。
所以我在 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。查看讨论以获取更多信息。
不过,您可以使用本地接口名称。