Найти - Пользователи
Полная версия: Ошибка типа данных
Начало » Python для новичков » Ошибка типа данных
1
atm87
Появляется ошибка. Как исправить? Нужно, чтобы результат был следующим:
Доменное имя для ('10.62.39.1', ‘10.62.39.2’, ‘10.62.39.3’, ‘10.62.39.4’, ‘10.62.39.5’) как ('WS0620390605', ‘WS0620391315’, ‘WS06939354’, ‘WS0650351315’, ‘WS0625481595’)

WS………… - это доменные имена компьютеров, которые должны браться с помощью gethostbyaddr

Ошибка:
 hostname = socket.gethostbyaddr(tuple(iplist))
                 ^^^^^^^^^^^^^^^^^^^^^^
TypeError: gethostbyaddr() argument 1 must be str, bytes or bytearray, not tuple

 import socket
from PyQt6 import QtCore, QtGui, QtWidgets
import ipaddress
 
# проверка на валидацию IP адресов
def ip_checkv4(self):
        ip1 = "10.62.39.1"
        ip2 = "10.62.39.5"
 
        if(ip1 == "" and ip2 == ""):
            print("Начальный и конечный IP-адреса должны быть введены.")
        elif(ipaddress.ip_address(ip1) and ipaddress.ip_address(ip2)):
            ipaddress1 = ip1.split(".") # ['10', '62', '39', '1']
            ipaddress2 = ip2.split(".") #['10', '62', '39', '5']
            if(ipaddress1[:3] == ipaddress2[:3]): # проверка на совпадение первых трех октетов ['10', '62', '39']['10', '62', '39']
                if(ipaddress1[3] < ipaddress2[3]): # если четвертый октет меньше, то выводим диапазон
                    # hostname = socket.gethostbyaddr(ip1)[0]
                    iplist = []
                    ipcur = ipaddress.ip_address(ip1)
                    while ipcur <= ipaddress.ip_address(ip2):
                        iplist.append(str(ipcur))
                        ipcur += 1
                        hostname = socket.gethostbyaddr(ipcur)
                    print(f"Доменное имя для {iplist} как {hostname}")
                else:
                    print("Четвертый октет первого IP адреса должен быть меньше четвертого октета второго IP адреса.")
            else:
                print("Первые три октета IP-адресов не совпадают.")
        else:
            print("Некорректно введены IP адреса.")
py.user.next
  
import ipaddress
import socket
 
def make_ip_range(start, end):
    out = []
    ipcur = ipaddress.ip_address(start)
    while ipcur <= ipaddress.ip_address(end):
        out.append(str(ipcur))
        ipcur += 1
    return out
 
def get_domain_name(ip):
    try:
        out = socket.gethostbyaddr(ip)[0]
    except socket.herror:
        out = None
    return out
 
def f():
    ipstart = '10.62.39.1'
    ipend = '10.62.39.12'
    iplist = make_ip_range(ipstart, ipend)
    namelist = list(map(get_domain_name, iplist))
    print(iplist)
    print(namelist)
 
f()

Пример с заглушкой
  
>>> import ipaddress
>>> import socket
>>> 
>>> def make_ip_range(start, end):
...     out = []
...     ipcur = ipaddress.ip_address(start)
...     while ipcur <= ipaddress.ip_address(end):
...         out.append(str(ipcur))
...         ipcur += 1
...     return out
... 
>>> def get_domain_name(ip):
...     try:
...         out = 'name for ' + str(ip)#socket.gethostbyaddr(ip)[0]
...     except socket.herror:
...         out = None
...     return out
... 
>>> def f():
...     ipstart = '10.62.39.1'
...     ipend = '10.62.39.12'
...     iplist = make_ip_range(ipstart, ipend)
...     namelist = list(map(get_domain_name, iplist))
...     print(iplist)
...     print(namelist)
... 
>>> f()
['10.62.39.1', '10.62.39.2', '10.62.39.3', '10.62.39.4', '10.62.39.5', '10.62.39.6', '10.62.39.7', '10.62.39.8', '10.62.39.9', '10.62.39.10', '10.62.39.11', '10.62.39.12']
['name for 10.62.39.1', 'name for 10.62.39.2', 'name for 10.62.39.3', 'name for 10.62.39.4', 'name for 10.62.39.5', 'name for 10.62.39.6', 'name for 10.62.39.7', 'name for 10.62.39.8', 'name for 10.62.39.9', 'name for 10.62.39.10', 'name for 10.62.39.11', 'name for 10.62.39.12']
>>>
atm87
Додумался сам, но думаю это как-то не красиво))

 iplist = []
hostname = []
ipcur = ipaddress.ip_address(ip1)
while ipcur <= ipaddress.ip_address(ip2):
    iplist.append(str(ipcur))
    ipcur += 1
    addr = socket.gethostbyaddr(str(ipcur))[0]
    hostname.append(addr)
print(f"Domain names {iplist} as {hostname}")
atm87
Вот так сейчас выглядит мой код:
 def ip_checkv4(self):
        ip1 = "10.62.39.1"
        ip2 = "10.62.39.5"
        if(ip1 == "" and ip2 == ""):
            print("Начальный и конечный IP-адреса должны быть введены.")
        elif(ipaddress.ip_address(ip1) and ipaddress.ip_address(ip2)):
            ipaddress1 = ip1.split(".")
            ipaddress2 = ip2.split(".")
            if(ipaddress1[:3] == ipaddress2[:3]): # проверка на совпадение первых трех октетов
                if(ipaddress1[3] < ipaddress2[3]): # если четвертый октет меньше, то выводим диапазон
                    iplist = []
                    hostname = []
                    ipcur = ipaddress.ip_address(ip1)
                    while ipcur <= ipaddress.ip_address(ip2):
                        iplist.append(str(ipcur))
                        ipcur += 1
                        addr = socket.gethostbyaddr(str(ipcur))[0]
                        hostname.append(addr)
                    print(f"IP-адресу {iplist} соответствует доменное имя {hostname}")
                else:
                    print("Четвертый октет первого IP адреса должен быть меньше четвертого октета второго IP адреса.")
            else:
                print("Первые три октета IP-адресов не совпадают.")
        else:
            print("Некорректно введены IP адреса.")
Вопрос. Если компьютер с IP адресом 10.62.39.4 отсутствует в домене, то появляется ошибка:
 addr = socket.gethostbyaddr(str(ipcur))[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket.herror: [Errno 11004] host not found
Как мне сделать так, чтобы, если какой-то компьютер не доступен, то выводилось бы сообщение “ПК не доступен”.
py.user.next
  
>>> import socket
>>> 
>>> def get_domain_name(ip):
...     try:
...         out = socket.gethostbyaddr(ip)[0]
...     except socket.herror:
...         out = None
...     return out
... 
>>> def test_address(address):
...     if get_domain_name(address) is not None:
...         print(address, 'доступен')
...     else:
...         print(address, 'недоступен')
... 
>>> test_address('127.0.0.1')
127.0.0.1 доступен
>>> test_address('123.0.0.1')
123.0.0.1 недоступен
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB