Объект модуля не может быть повторен

#python #python-3.x #typeerror

#python #python-3.x #ошибка типа

Вопрос:

При запуске python3 main.py :80/ возвращается TypeError: 'module' object is not iterable

Я знаю, что этот тип вопросов уже задается в сообществе, но ни один из предыдущих вопросов не смог решить мою проблему.

main.py:

 import ipaddress, concurrent.futures, requests, sys

def ipv4(ipaddress):
     net4 = ipaddress.ip_network('120.52.22.96/27')
     for host in net4.hosts():
          ipaddress = [print(str(host))]

def scan(ipaddress):
     headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
     r = requests.get('http://'   ipaddress   sys.argv[1], headers=headers, timeout=0.5)
     print(r.url, r.status_code, r.headers)

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
 executor.map(scan, ipaddress)
  

Сообщение об ошибке:

 Traceback (most recent call last):
File "main.py", line 14, in <module>
executor.map(scan, ipaddress)
File "/usr/lib/python3.8/concurrent/futures/_base.py", line 600, in map
fs = [self.submit(fn, *args) for args in zip(*iterables)]
TypeError: 'module' object is not iterable
  

Комментарии:

1. У меня готов ответ, но прежде чем я его опубликую, могу я, пожалуйста, проверить, почему вы хотите выполнить это сканирование?

2. На самом деле, то, что опубликовал Бастьен Харкинс, уже содержит основную суть того, что я собирался опубликовать, так что, возможно, мне не нужно публиковать свой ответ. Просто убедитесь, что у вас есть законная цель для сканирования целевой сети, потому что большинство сетевых сервисов, предназначенных для общего пользования, должны рекламироваться каким-либо образом, который не зависит от последовательного сканирования по IP-адресам для их поиска.

Ответ №1:

Присваивать переменным или параметрам имена импортированных модулей — не очень хорошая практика, потому что это вызовет у вас множество ошибок.

Следующее сначала генерирует ipv4 список, затем применяется scan к каждому элементу с использованием map

 import ipaddress, concurrent.futures, requests, sys

def ipv4():
    net4 = ipaddress.ip_network('120.52.22.96/27')
    IP_list = []
    for host in net4.hosts():
         IP_list.append(str(host))
    return IP_list

def scan(IP):
     headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
     r = requests.get('http://'   IP   sys.argv[1], headers=headers, timeout=0.5)
     print(r.url, r.status_code, r.headers)

ipv4_list = ipv4()

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    executor.map(scan, ipv4_list)
  

Комментарии:

1. Это должно сработать. Я просто надеюсь, что этим не злоупотребляют и что в Пекине нет какого-нибудь сетевого администратора, который задается вопросом, почему люди сканируют свою сеть.

Ответ №2:

Вы присваиваете объекту модуля executor.map , если вам нужно изменить значение переменной в функции, используйте global ключевое слово.

 def ipv4(ipaddress):
     global ipaddress
     net4 = ipaddress.ip_network('120.52.22.96/27')
     for host in net4.hosts():
          ipaddress = [print(str(host))]
  
 with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
 executor.map(scan, ipaddress)
  

Комментарии:

1. Зачем вам использовать global с параметром функции?

2. @alaniwi Я просто сделал это простым способом, я думал о добавлении всего host в список, а затем вернуть его, но я не уверен, что нужно делать коду.