#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
в список, а затем вернуть его, но я не уверен, что нужно делать коду.