2016-08-22 2 views
-1

В настоящее время я разрабатываю некоторые функции для одновременного доступа к нескольким удаленным устройствам SSH. Я столкнулся с проблемой, как показано ниже.Python Global Variable не работает

Traceback (most recent call last): 
    File "/Volume/Projects/SSH_Conn.py", line 51, in <module> 
    SSH_Thread() 
    File "/Volume/Projects/SSH_Conn.py", line 43, in SSH_Thread 
    for ip in list_ip: 
NameError: global name 'list_ip' is not defined 

Я довольно уверен, что я создал глобальный параметр на моих кодов ниже:

def ip_file(): 
    **global list_ip** 
    ip_list_file = open('ip.txt', 'r') 
    ip_list_file.seek(0) 
    list_ip = ip_list_file.readlines() 
    ip_list_file.close() 

def ssh_conn(ip): 
    date_time = datetime.datetime.now().strftime("%Y-%m-%d") 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(ip, port=22, username='x', password='y', look_for_keys=False, timeout=None) 
    connection = ssh.invoke_shell() 
    connection.send("\n") 
    connection.send("ls -l\n") 
    time.sleep(2) 
    file_output = connection.recv(9999) 
    hostname = (re.search(r'(.+)$', file_output)).group().strip('$') 
    outFile = open(hostname + "-" + str(date_time) + ".txt", "w") 
    outFile.write(file_output) 

def SSH_Thread(): 
    threads_instance = [] 
    for ip in list_ip: 
     ti = threading.Thread(target=ssh_conn, args=(ip,)) 
     ti.start() 
     threads_instance.append(ti) 

    for ti in threads_instance: 
     ti.join() 

SSH_Thread() 

Есть ли другой параметр, который нужно использовать в своем коде?

ответ

0

Просто верните значение из вашей функции, вместо того чтобы иметь дело с глобальными.

def ip_file(): 
    ip_list_file = open('ip.txt', 'r') 
    ip_list_file.seek(0) 
    list_ip = ip_list_file.readlines() 
    ip_list_file.close() 
    return list_ip # return the value, so others can use it. 

Затем, когда вы хотите использовать его, просто вызовите функцию и сохранить результат:

def SSH_Thread(): 
    threads_instance = [] 
    list_ip = ip_file() # here is where you get the result back 
    for ip in list_ip: 
     ti = threading.Thread(target=ssh_conn, args=(ip,)) 
     ti.start() 
     threads_instance.append(ti) 

    for ti in threads_instance: 
     ti.join() 
+0

Спасибо, он хорошо работает – nanto

0

Вы создали глобальный параметр list_ip в функции ip_file, но функция никогда.

Так QuickFix будет:

def SSH_Thread(): 
    threads_instance = [] 
    ip_file() # <--------------- generate the list 
    for ip in list_ip: 
     ti = threading.Thread(target=ssh_conn, args=(ip,)) 
     ti.start() 
     threads_instance.append(ti) 

    for ti in threads_instance: 
     ti.join() 

Кстати, лучше return список вместо того, чтобы хранить результат в глобальной переменной.

+0

Спасибо, спасибо за ваш совет. Я использую return on ip_file function – nanto