You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在断开网络时移除Python OSC服务列表中存储的OSC消息

解决方法

你遇到的问题是全局存储OSC消息的三个列表没有在服务断开时触发重置,只要在服务停止的逻辑里补充清空列表的代码即可,修改步骤如下:

  1. 找到第一次服务监听循环里的KeyboardInterrupt捕获分支,在跳出循环前添加清空列表的语句
  2. 找到后续询问是否继续的循环里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 15:09:03