2016-08-22 8 views
-1

Zur Zeit entwickle ich einige Funktionen, um einen SSH Zugriff auf mehrere Remote-Geräte zur gleichen Zeit zu tun. Ich bin auf ein Problem wie unten gestoßen.Python Global Variable funktioniert nicht

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 

Ich bin ziemlich sicher, dass ich den globalen Parameter auf meine Codes unten erstellt haben:

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() 

Gibt es, die ich brauche andere Parameter in meinem Code zu benutzen?

Antwort

0

Geben Sie einfach den Wert aus Ihrer Funktion zurück, anstatt mit globalen Variablen zu arbeiten.

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. 

Dann, wenn Sie es verwenden möchten, nur die Funktion aufrufen und speichern Sie das Ergebnis:

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

Vielen Dank, es funktioniert gut – nanto

0

Sie die globalen Parameter erstellt haben list_ip in der ip_file Funktion, aber die Funktion ist nie genannt.

So wäre ein quickfix sein:

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() 

Durch die Art und Weise ist es besser, return die Liste stattdessen das Ergebnis in einer globalen Variablen zu speichern.

+0

Vielen Dank, vielen Dank für Ihren Rat. Ich benutze return on ip_file function – nanto

Verwandte Themen