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

C++通过命名管道向pywin32 Python传数据报错231如何解决

问题原因
  • 管道读写模式不匹配:C++创建管道时指定了PIPE_TYPE_BYTE(字节模式),但Python端调用SetNamedPipeHandleState时设置了PIPE_READMODE_MESSAGE(消息读取模式),模式不兼容导致管道连接异常,触发231(所有管道实例忙)报错。
  • 可选优化点:报错时没有重试逻辑,若Python启动时机略早于C++管道就绪也会偶发231错误。

方案1:统一使用字节模式(改动最小,适合当前场景)

C++端无需改动,仅修改Python代码即可:

import win32file
import win32pipe
import pywintypes
import time

quit = False
while not quit:
    try:
        handle = win32file.CreateFile(
            "\\\\.\\pipe\\example",
            win32file.GENERIC_READ,
            0,
            None,
            win32file.OPEN_EXISTING,
            0,
            None
        )
        # 删除原有设置消息模式的代码,默认字节模式和C++端匹配
        while True:
            resp = win32file.ReadFile(handle, 64*1024)
            # C++发送的是宽字符,用utf-16le解码即可得到正常可读字符串
            print(f"message: {resp[1].decode('utf-16le')}")
    except pywintypes.error as e:
        # 231为管道忙,等待1秒重试即可
        if e.args[0] == 231:
            time.sleep(1)
            continue
        # 232为管道已关闭,属于正常通信结束
        print(f"错误码:{e.args[0]},错误信息:{e.args[2]}")
        quit = True

运行顺序:先启动C++程序,待输出Waiting for a client to connect to the pipe...后再启动Python脚本即可正常通信。


方案2:统一使用消息模式(适合后续多消息传输场景)

如果后续需要基于消息边界拆分传输内容,可修改C++端管道创建参数,Python端保留原有消息模式配置即可:

// 仅修改CreateNamedPipe第三个参数,其余代码不变
HANDLE pipe = CreateNamedPipe(L"\\\\.\\pipe\\example",
    PIPE_ACCESS_OUTBOUND, 
    PIPE_TYPE_MESSAGE | PIPE_WAIT, // 改为消息模式,和Python端配置匹配
    1, 0, 0, 0, NULL);

Python端读取到的字节串同样用utf-16le解码即可得到正常文本。

内容的提问来源于stack exchange,提问作者Egor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 18:12:01