模块'selectors'没有属性"默认选择器"?



当我涉足客户端-服务器关系时,我一直遵循这个指南(https://realpython.com/python-sockets/)。在构建多连接服务器/客户端时,我遇到了这个错误:

event read:  1
event write:  2
Traceback (most recent call last):
  File "multiconn-server.py", line 8, in <module>
    sel = selectors.DefaultSelector()
AttributeError: module 'selectors' has no attribute 'DefaultSelector'

这个解决方案没有帮助:https://github.com/pantsbuild/pants/issues/8845

我目前使用的是Windows 10。我想如果我不能使用/理解选择器(尽管我从指南中编写了代码,但仍然很难理解),我可以使用asyncio代替。如果有帮助的话,下面是代码:

import selectors
import socket
import types
HOST = '127.0.0.1'
PORT = 65432 
sel = selectors.DefaultSelector()
def service_connection(key, mask):
    sock = key.fileobj
    data = key.data
    if mask & selectors.EVENT_READ:
        recv_data = sock.recv(1024) # should be ready to read
        if recv_data:
            data.outb += recv_data
        else:
            print('closing connection to', data.addr)
            sel.unregister(sock)
            sock.close()
    if mask & selectors.EVENT_WRITE:
        if data.outb:
            print('echoing', repr(data.outb), 'to', data.addr)
            sent = sock.send(data.outb) # should be ready to write
            data.outb = data.outb[sent:]
def accept_wrapper(sock):
    conn, addr = sock.accept() # socket object and address returned
    print('accepted connection from', addr)
    conn.setblocking(False)
    data = types.simpleNamespace(addr=addr, inb=b'', outb=b'')
    events = selectors.EVENT_READ | selectors.EVENT_WRITE
    sel.register(conn, events, data=data)
# listening socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as lsock:
    lsock.bind((HOST, PORT))
    lsock.listen()
    print('listening on', (HOST, PORT))
    lsock.setblocking(False) # socket can no longer block
    sel.register(lsock, selectors.EVENT_READ, data=None) # monitored with select() for events you're interested in
    while True:
        events = sel.select(timeout=None) # blocks until there are sockets ready for I/O
                                          # we wait for events on one or more sockets
        for key, mask in events:
            if key.data is None:
                accept_wrapper(key.fileobj)
            else:
                service_connection(key, mask)

我找到了我的解决方案:https://luxiyalu.com/attributeerror-module-selectors-has-no-attribute-selectselector/显然我的select.py的文件名干扰了什么。当我重命名我的文件时,它就解决了。

最新更新