[英]Named Pipes between C# and Python
我正在尝试在两个程序之间创建一个双向通信通道(一个在 Python 中,另一个在 C# 中)
当我在两个 C# 程序或两个 Python 程序之间创建命名管道时,一切正常,但是当我尝试(例如)从 Python 代码连接到 C# 服务器时,它不起作用:
C#代码:
NamedPipeServerStream server = new NamedPipeServerStream(
"Demo", PipeDirection.InOut, 100, PipeTransmissionMode.Byte,
PipeOptions.None, 4096, 4096)
如果我在 Python 中使用win32pipe
,则ConnectNamedPipe
上的代码块(它永远不会返回)
p = win32pipe.CreateNamedPipe(
r'\\.\pipe\Demo',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
1, 65536, 65536,
300,
None)
win32pipe.ConnectNamedPipe(p)
如果我使用 open 函数,它只是建立一个连接,但什么也没发生:
open( '\\\\.\\pipe\\Demo', 'r+b' )
现在,如果我关闭 Python 程序,C# 服务器仅从 Python 接收一个数据项,并且System.IO.IOException
会引发“管道已损坏”消息
我做错了什么吗?
根据MS 的说法, ConnectNamedPipe
是“用于接受连接的服务器端功能”。 这就是它永远不会返回的原因——它正在等待来自客户端的连接。 下面是一些示例代码,将 C# 显示为服务器,将 python 显示为客户端:
C#:
using (var server = new NamedPipeServerStream("Demo"))
{
server.WaitForConnection();
using (var stream = new MemoryStream())
using (var writer = new BinaryWriter(stream))
{
writer.Write("\"hello\"");
server.Write(stream.ToArray(), 0, stream.ToArray().Length);
}
server.Disconnect();
}
蟒蛇:
import win32file
fileHandle = win32file.CreateFile(
"\\\\.\\pipe\\Demo",
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
0,
None,
win32file.OPEN_EXISTING,
0,
None)
left, data = win32file.ReadFile(fileHandle, 4096)
print(data) # "hello"
好的,我解决了问题。 我应该寻求定位缓冲区的 0。
我的 Python 代码:
win32file.WriteFile(CLIENT_PIPE,"%d\r\n"%i ,None)
win32file.FlushFileBuffers(CLIENT_PIPE)
win32file.SetFilePointer(CLIENT_PIPE,0,win32file.FILE_BEGIN)
i,s = win32file.ReadFile(CLIENT_PIPE,10,None)
我认为您打算使用 win32pipe.popen,而不是 open。
也可以尝试:pipe.flush()、pipe.read() 和 time.sleep(0.01)。 有时 IPC 需要一段时间才能同步。
我真的不知道,这是我对子流程管道的经验。 win32pipe 可能会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.