2015-02-16 4 views
0

Этот модуль возвращает список. Когда я вызываю модуль с ipscan.scan('192.168.11', 161), список добавляется вместо того, чтобы возвращать новый. Единственный способ, которым мне удалось «перезагрузить» список, было переназначить глобальный ключ параметра «node_list» следующим образом: ipscan.scan.func_globals['node_list'] = []Модуль Python, повторно использующий один и тот же объект

Будучи новичком, я не знаю, как лучше описать проблему. Спасибо!

import socket 
from threading import Thread 

socket.setdefaulttimeout(1) 

node_list = [] 


def probe(ip, port): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    try: 
     s.connect((ip, port)) 
     node_list.append(ip) 
    except: 
     pass 

    s.close() 


def scan(ipnet, port): 
    for x in range(1,255): 
     ip = '{0}.{1}'.format(ipnet, x) 

     t = Thread(target=probe, args=(ip, port)) 
     t.start() 

    return node_list 

Правильная инициализация node_list:

import socket 
from threading import Thread 

socket.setdefaulttimeout(1) 


def probe(ip, port): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    try: 
     s.connect((ip, port)) 
     node_list.append(ip) 
    except: 
     pass 

    s.close() 


def scan(ipnet, port): 
    global node_list 
    node_list = [] 

    for x in range(1,255): 
     ip = '{0}.{1}'.format(ipnet, x) 

     t = Thread(target=probe, args=(ip, port)) 
     t.start() 

    return node_list 
+0

Вы пробовали просто вызвать node_list = [] перед циклом сканирования? – danielfranca

+0

Да, такое же поведение. – dann

+0

Когда вы говорите: «список добавляется вместо того, чтобы возвращать новый». вы имеете в виду, что если вы дважды назовете «сканирование», он добавит новые значения в один список? – danielfranca

ответ

0

Это достаточно просто, не декларируют свой список за пределами функции.

node_list = [] Move в определении функции:

def scan(ipnet, port): 
    node_list = [] 
    for x in range(1,255): 
     ip = '{0}.{1}'.format(ipnet, x) 

     t = Thread(target=probe, args=(ip, port)) 
     t.start() 

    return node_list 

По сути, вы хотите, чтобы прочитать немного больше пространств имен.

+0

В коде OP функция 'probe' добавляется к' node_list'. – khelwood

+0

С учетом того, что 'node_list' должен быть' global'. – dann

Смежные вопросы