Windows 10下OSError: [WinError 10022]无效参数错误求助
解决Windows下Python selectors模块的WinError 10022错误
我来帮你排查这个问题!你遇到的OSError: [WinError 10022] An invalid argument was supplied错误,结合你的代码和Windows环境,主要有几个关键点需要修复:
1. 先修复基础语法错误
你的代码里有个明显的拼写错误:if key.data is none:这里的none是小写的,但Python中空值的正确写法是大写的None。这个错误虽然不一定直接触发WinError 10022,但会先引发NameError,必须优先修正。
2. Windows下selectors的核心限制
在Windows系统上,selectors.DefaultSelector会默认使用SelectSelector,而这个选择器有个关键限制:不能在没有注册任何文件对象的情况下调用sel.select()。如果你的代码在进入while True循环前,没有向selector注册监听socket,就会触发这个"无效参数"错误——因为Windows的select() API不允许传入空的文件描述符集合。
3. 完整的修正代码示例
结合以上两点,我调整了你的代码,确保正确注册监听socket,同时修复语法错误:
import selectors import socket sel = selectors.DefaultSelector() def accept_wrapper(key): # 从key中获取监听socket lsock = key.fileobj conn, addr = lsock.accept() print(f"Accepted connection from {addr}") conn.setblocking(False) # 注册新连接的socket,指定可读事件和处理函数 sel.register(conn, selectors.EVENT_READ, data=service_connection) def service_connection(key, mask): sock = key.fileobj try: recv_data = sock.recv(1024) if recv_data: print(f"Received {recv_data!r} from {sock.getpeername()}") sock.sendall(recv_data) else: print(f"Closing connection to {sock.getpeername()}") sel.unregister(sock) sock.close() except Exception as e: print(f"Error handling connection: {e}") sel.unregister(sock) sock.close() # 关键步骤:创建并注册监听socket lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) lsock.bind(("localhost", 65432)) lsock.listen() print(f"Listening on ('localhost', 65432)") lsock.setblocking(False) # 注册监听socket,指定可读事件,data设为None用来区分新连接 sel.register(lsock, selectors.EVENT_READ, data=None) while True: events = sel.select(timeout=None) for key, mask in events: if key.data is None: accept_wrapper(key) else: # 直接调用data对应的处理函数 key.data(key, mask)
额外说明
- 原代码中
accept_wrapper(key,fileobj)的fileobj参数是多余的,因为key.fileobj已经包含了注册的文件对象,直接从key中获取即可。 - 确保所有socket都设置为非阻塞模式(
setblocking(False)),这是selectors模块正确工作的前提。
内容的提问来源于stack exchange,提问作者nas380
相关产品推荐
相关产品推荐

