如何在断开网络时移除Python OSC服务列表中存储的OSC消息
解决方法
你遇到的问题是全局存储OSC消息的三个列表没有在服务断开时触发重置,只要在服务停止的逻辑里补充清空列表的代码即可,修改步骤如下:
- 找到第一次服务监听循环里的
KeyboardInterrupt捕获分支,在跳出循环前添加清空列表的语句 - 找到后续询问是否继续的循环里的
KeyboardInterrupt捕获分支,每次打印完历史消息后添加清空列表的语句,保证下次启动服务时列表为空
修改后的完整代码如下:
# 用于创建简单易用的命令行应用的模块 import argparse # pythonosc库中无需消息收发方直接连接的模块 from pythonosc import dispatcher # pythonosc库中用于接收OSC格式消息的服务模块 from pythonosc import osc_server from pythonosc.osc_server import BlockingOSCUDPServer # 存储"hello"类消息的列表 hello = [] # 存储"input"类消息的列表 entrada = [] # 存储"output"类消息的列表 saida = [] # 将消息添加到hello列表的处理函数 def getHello(address:str): hello.append(address) # 将消息添加到entrada列表的处理函数 def getEntrada(address:str): entrada.append(address) # 将消息添加到saida列表的处理函数 def getSaida(address:str): saida.append(address) if __name__ == "__main__": parser = argparse.ArgumentParser() # 设置服务监听IP parser.add_argument("--ip", default="224.0.0.1", help="监听的IP地址") # 设置服务监听端口 parser.add_argument("--port", type=int, default=60000, help="监听的端口") args = parser.parse_args() dispatcher = dispatcher.Dispatcher() # 绑定OSC地址和对应处理函数 dispatcher.map("/hello/*", getHello) dispatcher.map("/input/*", getEntrada) dispatcher.map("/output/*", getSaida) server = osc_server.ThreadingOSCUDPServer((args.ip, args.port), dispatcher) while True: try: print("服务运行于 {}".format(server.server_address)) server.serve_forever() except KeyboardInterrupt: # 停止服务时清空所有存储的消息 hello.clear() entrada.clear() saida.clear() break print("\n") print(hello) print(entrada) print(saida) print("\n") while input("是否继续运行? [y/n]") == "y": print("\n") try: print("服务运行于 {}".format(server.server_address)) server.serve_forever() except KeyboardInterrupt: print("\n") print(hello) print(entrada) print(saida) print("\n") # 每次停止服务后清空列表 hello.clear() entrada.clear() saida.clear() else: quit()
内容的提问来源于stack exchange,提问作者kobe
相关产品推荐
相关产品推荐

