Python 表示 paramiko 客户端未在函数中定义,函数已经 运行 成功一次

Python says paramiko client is not defined in function after function already run succesfully once

我正在使用 Paramiko 和 Pyqt 制作脚本管理器。当我的程序启动时,我连接到我的 raspberry pi 和 运行 函数 get_proc() 成功执行并在我的 pi 上打印出所有 运行ning 进程作为证据。然后我有一个按钮,按下时执行函数 dump_start_click,它使用 get_proc() 的 return 作为其逻辑。按下按钮时,我得到 NameError: 'client is not defined 。我从不 运行 client.close()。如果我在主语句下连续多次使用 get_proc(),它们都可以完美执行,但从另一个函数调用它会失败。有什么想法吗?

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

我认为问题和区别在于您 运行 get_proc() 通过执行此脚本。并且您正在尝试从导入它的另一个模块 运行 dump_start_click() 。问题是当您在其他地方导入 dump_start_click 时,if __name__ == "__main__": 中的代码未执行,因此未定义 client。如果您从 if __name__ == "__main__": 中提取 client 创建行,它应该可以工作。

并检查 this question 了解更多信息。