BlockingIOError: [WinError 10035] 无法立即完成非阻塞套接字操作

时间:2021-05-10 17:05:53

标签: python

我正在使用朋友的脚本来控制 Ableton 11 槽 OSC 消息(现在处于测试阶段),将推子数据发送到脚本时出现此错误:

data, addr = self._socket.recvfrom(65536) BlockingIOError: [WinError 10035] 无法立即完成非阻塞套接字操作。

他使用的是 mac,所以我认为这是 Windows 特定的东西。

(我几乎不知道 python,但我擅长谷歌搜索;))

class OSCServer:
def __init__(self, local_addr=('127.0.0.1', OSC_LISTEN_PORT), remote_addr=('127.0.0.1', OSC_RESPONSE_PORT)):
    """
    Class that handles OSC server and client responsibilitiess

    Implemented because pythonosc's OSC server causes a beachball when handling
    incoming messages. To investigate, as it would be ultimately better not to have
    to roll our own.
    """
    self._local_addr = local_addr
    self._remote_addr = remote_addr

    self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self._socket.setblocking(0)
    self._socket.bind(self._local_addr)
    self._callbacks = {}

    self.logger = logging.getLogger("abletonosc")
    self.logger.info("Starting OSC server (local %s, remote %s)",
                     str(self._local_addr), str(self._remote_addr))

def add_handler(self, address: str, handler: Callable):
    self._callbacks[address] = handler

def clear_handlers(self):
    self._callbacks = {}

def send(self, address: str, params: Tuple[Any] = ()) -> None:
    """
    Send an OSC message.

    Args:
        address: The OSC address (e.g. /frequency)
        params: A tuple of zero or more OSC params
    """
    msg_builder = OscMessageBuilder(address)
    for param in params:
        msg_builder.add_arg(param)

    try:
        msg = msg_builder.build()
        self._socket.sendto(msg.dgram, self._remote_addr)
    except BuildError:
        self.logger.info("AbletonOSC: OSC build error: %s" % (traceback.format_exc()))

def process(self) -> None:
    """
    Synchronously process all data queued on the OSC socket.
    """
    try:
        while True:
            data, addr = self._socket.recvfrom(65536)
            try:
                message = OscMessage(data)

                if message.address in self._callbacks:
                    callback = self._callbacks[message.address]
                    rv = callback(message.params)

                    if rv is not None:
                        self.send(message.address, rv)
                else:
                    self.logger.info("AbletonOSC: Unknown OSC address: %s" % message.address)
            except ParseError:
                self.logger.info("AbletonOSC: OSC parse error: %s" % (traceback.format_exc()))

    except socket.error as e:
        if e.errno == errno.EAGAIN:
            return
        else:
            self.logger.info("AbletonOSC: Socket error: %s" % (traceback.format_exc()))

    except Exception as e:
        self.logger.info("AbletonOSC: Error handling message: %s" % (traceback.format_exc()))

def shutdown(self) -> None:
    """
    Shutdown the server network sockets.
    """
    self._socket.close()

0 个答案:

没有答案
相关问题