У меня проблемы с python-osc, вызывающим RuntimeError всякий раз, когда я меняю отображения диспетчера.Ниже приведены два списка Python.Первый - это простой клиент OSC, который передает одно из трех сообщений: / ping / map-foo и /foo.
Второй - сервер OSC, который отвечает на эти сообщения.Первоначально сервер отвечает только на / ping и / map-foo.При получении / map-foo сообщение / foo добавляется на карту диспетчера.Добавление сопоставления к / foo вызывает ошибку, как показано ниже.Сервер продолжает работать и, несмотря на ошибку, устанавливается сопоставление с / foo.Если клиент передает / foo, сервер отвечает ожидаемым образом.
Это небольшое искажение гораздо более крупного приложения.Я могу определить столько статических сообщений OSC заранее, сколько захочу.Однако мне нужно иметь возможность добавлять их динамически во время работы приложения.
Python 3.7.2 на Манджаро
# client code
# usage: python client.py --> transmits /ping
# python client.py /whatever --> transmits /whatever
#
import sys
from pythonosc.udp_client import SimpleUDPClient
ip, port = "127.0.0.1", 5000
def send(message):
print("Sending {}".format(message))
client = SimpleUDPClient(ip, port)
client.send_message(message, " ")
if __name__ == '__main__':
argv = sys.argv
if len(argv) == 1:
send("/ping")
else:
send(argv[1])
# server code
#
from pythonosc.dispatcher import Dispatcher
from pythonosc.osc_server import ThreadingOSCUDPServer
ip, port = "127.0.0.1", 5000
dispatcher = Dispatcher()
def foo(*_):
print("foo message received")
def ping(*_):
print("ping message received")
def map_foo(*_):
print("map-foo message received")
dispatcher.map("/foo", foo)
dispatcher.map("/ping", ping)
dispatcher.map("/map-foo", map_foo)
server = ThreadingOSCUDPServer((ip, port), dispatcher)
print("Serving...")
server.serve_forever()
#
# Results, client and server running is seperate terminals
#
[sj@crow] python server.py
Serving...
[sj@crow]$ python client.py
server --> ping message received
[sj@crow]$ python client.py /foo
server --> <does not respond, /foo not currently mapped>
[sj@crow]$ python client.py /map-foo
server -->
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 47064)
Traceback (most recent call last):
File "/usr/lib/python3.7/socketserver.py", line 650, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python3.7/socketserver.py", line 360, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python3.7/socketserver.py", line 720, in __init__
self.handle()
File "/usr/lib/python3.7/site-packages/pythonosc/osc_server.py", line 55, in handle
self.server.dispatcher.call_handlers_for_packet(self.request[0], self.client_address)
le "/usr/lib/python3.7/site-packages/pythonosc/dispatcher.py", line 111, in call_handlers_for_packet
for handler in handlers:
File "/usr/lib/python3.7/site-packages/pythonosc/dispatcher.py", line 74, in handlers_for_address
for addr, handlers in self._map.items():
RuntimeError: dictionary changed size during iteration
----------------------------------------
[sj@crow]$ python client.py /foo
server --> foo message received