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
相关产品推荐
相关产品推荐

