在我使用 nicegui 的 python 脚本中有一个循环。
脚本执行
verif_input()
时没有停止。
您可以在下面找到我简化的脚本:
def verif_input():
...
net_connect = ConnectHandler(ip=router["ip"], username=router["username"], password=router["password"], device_type=router["device_type"], fast_cli=False)
result = net_connect.send_command("exec " + input_file.rsplit('/', 1)[1], strip_prompt=False,strip_command=False, cmd_verify=False)
result += net_connect.send_command_timing("admin save", cmd_verify=False)
....
def mainfct():
with ui.stepper().props('vertical').classes('w-full') as stepper:
with ui.step('step 1'):
with ui.stepper_navigation():
ui.button('Next', on_click=stepper.next)
with ui.step('step 2'):
with ui.stepper_navigation():
ui.button('Next', on_click=stepper.next)
ui.button('Back', on_click=stepper.previous).props('flat')
with ui.step('step 3'):
with ui.stepper_navigation():
ui.button('Verif', on_click=lambda: ui.navigate.to('/FTTO_PHASE1_RES_page', new_tab=True)).props('no-caps')
ui.button('Back', on_click=stepper.previous).props('flat')
@ui.page('/FTTO_PHASE1_RES_page',title='PHASE1_RES1')
def PHASE1_RES_page():
verif_input()
ui.button('GO', on_click=lambda: ui.navigate.to('/FTTO_PHASE1_page', new_tab=True)).props('no-caps')
@ui.page('/FTTO_PHASE1_page',title='FTTO_PHASE1')
def PHASE1_page():
ui.button('GO', on_click=lambda: mainfct()).props('no-caps')
ui.run()
我刚刚发现,只有 Netmiko 的这一行 "admin save" 导致了这个问题。
result += net_connect.send_command_timing("admin save", cmd_verify=False)
您知道 "admin save" 和循环之间的联系吗?
问题很可能出在
net_connect.send_command_timing("admin save", cmd_verify=False)
这一行,特别是
send_command_timing
这个方法上。 虽然代码片段没有展示
send_command_timing
的具体实现,但根据其名称和使用场景可以推断,它很可能包含以下逻辑:
- 发送命令 : 向设备发送 "admin save" 命令。
- 等待响应 : 等待设备返回命令执行结果或者超时。
- 返回结果 : 将设备返回的结果返回给调用方。
在这个过程中,
等待响应
这一步很可能会阻塞当前线程的执行,直到收到设备的响应或者超时。如果设备响应缓慢或者网络连接存在问题,
send_command_timing
方法就会长时间阻塞,导致
verif_input
函数无法正常结束,进而导致 NiceGUI 界面卡住。
解决方法:
-
异步执行
: 将
send_command_timing
的调用放到一个独立的线程或者协程中异步执行,避免阻塞 NiceGUI 的主线程。可以使用 Python 的threading
模块或者asyncio
库实现。
```python import asyncio
async def run_admin_save(net_connect): result = await net_connect.send_command_timing("admin save", cmd_verify=False) return result
async def verif_input(): ... result = await asyncio.create_task(run_admin_save(net_connect)) ... ```
-
超时机制 : 为
send_command_timing
方法设置一个合理的超时时间。如果超过指定时间还没有收到设备的响应,则抛出异常或者返回一个默认值,避免无限期地等待。 -
优化设备配置 : 检查设备配置,确保 "admin save" 命令能够快速执行。可以尝试优化设备的硬件配置、调整系统参数或者升级设备固件。
-
排查网络问题 : 检查网络连接是否稳定,网络延迟是否过高。可以尝试使用
ping
命令测试网络连通性和延迟。
通过以上方法,可以解决
send_command_timing
方法阻塞导致 NiceGUI 界面卡住的问题,使你的 Python 脚本能够正常运行。