You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:26:07