Estoy usando Paramiko y Pyqt para hacer un administrador de scripts. Cuando mi programa se inicia, me conecté a mi raspberry pi y ejecuté la función get_proc () que se ejecuta con éxito e imprime todos los procesos en ejecución en mi pi como evidencia. Luego tengo un botón que cuando se presiona ejecuta la función dump_start_click que usa el retorno de get_proc () para su lógica. Al presionar el botón, obtengo NameError: 'client is not defined. Nunca ejecuto client.close (). Si tuviera get_proc () varias veces seguidas en mi declaración principal, todas se ejecutan perfectamente, pero la llamada desde otra función falla. ¿Algunas ideas?

def dump_start_click():
    if get_proc() == 'offline':
        ssh_log("Starting Dump 1090")
        stdin, stdout, stderr = client.exec_command('/home/pi/dump1090/./dump1090 --quiet --net')
        stdin.close()
        stdout.close()
        stderr.close()
        time.sleep(1)
        proc_id = get_proc()
        if proc_id != 'failed':
            ssh_log("Dump 1090 started successfully")
            ssh_log("Process id : " + proc_id)

    else:
        ssh_log('Dump 1090 is already running!')

def get_proc():
    stdin, stdout, stderr = client.exec_command('ps aux')
    x = stdout.read().decode("utf8")
    print(x)
    dump_proc = []
    for line in x.split('\n'):
        if 'dump1090' in line:
            buff = line.split(' ')
            for j in buff:
                if j != '':
                    dump_proc.append(j)
    if len(dump_proc) == 0:
        return 'offline'
    return dump_proc[1]



if __name__ == "__main__":
    client = SSHClient()
    client.set_missing_host_key_policy(AutoAddPolicy)
    client.load_system_host_keys()
    # Known_host policy
    client.set_missing_host_key_policy(AutoAddPolicy())
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = control_ui(MainWindow)
    MainWindow.show()
    try:
        ssh_log("Connecting to Pi...")
        client.connect('192.168.0.29', username='pi', password='redacted')
    except:
        ssh_log("SSH Connection Failed")
    ssh_log("Connected!")
    get_proc()
    win32api.SetConsoleCtrlHandler(on_exit, True)
    try:
        pretty.install()
        ssh_connect()
    except KeyboardInterrupt:
        on_exit(True)
    app.exec_()
-1
LeonJones 4 mar. 2021 a las 17:43

1 respuesta

La mejor respuesta

Creo que el problema y la diferencia es que ejecuta get_proc() ejecutando este script. Y está intentando ejecutar dump_start_click() desde otro módulo donde lo importa. El problema es que cuando importa dump_start_click en otro lugar, el código dentro de if __name__ == "__main__": no se ejecuta, por lo tanto, client no está definido. Si extrae las líneas de creación client de if __name__ == "__main__":, debería funcionar.

Y consulte esta pregunta para obtener más información.

0
Yevhen Kuzmovych 4 mar. 2021 a las 14:54