повышение python-osc RuntimeError - PullRequest
0 голосов
/ 05 марта 2019

У меня проблемы с 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
...