python - 在断开连接之前等待读取命名管道
问题描述
我有一个用 Python 编写的程序,我需要从 C++ 程序中联系它。我在 C++ 程序上创建管道服务器,客户端在 Python 中。每次我尝试不同的行为时,我都无法理解如何在两个程序之间正确读/写。请注意,我希望管道保持打开状态,以便将来进行多次读取/写入。
服务器 (C++)
#include <windows.h>
#include <iostream>
using namespace std;
#define FGPIPE TEXT("\\\\.\\pipe\\FGChroma")
int main()
{
HANDLE hPipe;
DWORD dwWritten;
DWORD MAX_BUF_SIZE = 8;
hPipe = CreateNamedPipe(FGPIPE,
PIPE_ACCESS_OUTBOUND,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
2,
MAX_BUF_SIZE*16,
0,
NMPWAIT_USE_DEFAULT_WAIT,
NULL
);
cout<<"Pipe? "<<hPipe<<endl;
cout<<"Awaiting Connection"<<endl;
cout<<ConnectNamedPipe(hPipe, NULL)<<endl;
cout<<"Connected"<<endl;
WriteFile(hPipe, "MSG1\n", 5, &dwWritten, NULL);
WriteFile(hPipe, "MSG2\n", 5, &dwWritten, NULL);
FlushFileBuffers(hPipe);
///Need to Wait for read here
cout<<"Disconnecting"<<endl;
DisconnectNamedPipe(hPipe);
}
客户端(Python)
f = open(r"\\.\\pipe\\FGChroma", 'r', 0)
while True:
value = f.read()
print(value)
当我尝试f.read()
在 Python 中执行此操作时,我收到错误 OSError 22 Invalid Argument,这是公平的,因为我已经断开了管道。但是,如果我不断开管道,那么 Python 代码永远不会完成读取并一直等到管道关闭或断开连接。我觉得解决方案很简单,我只是错过了一些让我头疼的小东西。我阅读了命名管道和 Win API 的文档,我还尝试了 win32py 和其他替代方法,但我遇到了同样的问题;我不明白如何保持两个实例之间的连接并允许阅读而不必断开连接或等待阅读。
解决方案
我认为 Pythonf.read()
和 Windows 管道存在问题。也许我错过了一些东西,但是当你像你一样读取管道时似乎没有 EOF,并且 pythonread()
会读取结束并出错,即使它之前正确读取了所有内容。
要解决此问题,您可以使用缓冲管道 ( open(r"pipe", 'r')
),然后一个接一个地读取字符 ( f.read(1)
) 直到出现错误,或者使用os.read(f.fileno(), 1024)
较低级别且在这种情况下有效的 。
推荐阅读
- node.js - NodeJS Azure Cosmos 搜索失败
- arrays - 麻烦保存和读取静态对象数组到 NSDefaults
- google-apps-script - 如何将 Google Application Script 项目迁移到不同的帐户?
- environment-variables - Wallaby.js 不工作(无法从 'node_modules/cpm-config.app.js' 中找到模块 '../../config-test.json')
- angular - 量角器角度同步失败,来自 webdriver 的错误 - “无法读取未定义的属性 '$injector'”
- flutter - 如果用户注销并重新登录,WillPopScope 将不起作用
- azure-virtual-machine - 如何使用 Azure VPN 作为代理网关
- linux - 无法使用正确的密码连接到 ssh
- ios - 加载太多图像时,Ionic 5 iOS 应用程序重新启动
- java - @Transactional 注释仅在类中声明时有效