在C#和Python之间命名pipe道

我试图在两个程序(Python中的一个和C#中的另一个)之间创build一个双向通信通道。

当我在两个C#程序或两个Python程序之间创build命名pipe道时,一切正常,但是当我尝试(例如)从Python代码连接到C#服务器时,它不起作用:

C#代码:

NamedPipeServerStream server = new NamedPipeServerStream( "Demo", PipeDirection.InOut, 100, PipeTransmissionMode.Byte, PipeOptions.None, 4096, 4096) 

如果我在Python中使用win32pipeConnectNamedPipe上的代码块(它永远不会返回)

 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) 

如果我使用打开的function,它只是build立一个连接,但没有发生:

 open( '\\\\.\\pipe\\Demo', 'r+b' ) 

现在,如果我closures了Python程序,C#服务器只接收到一个来自Python的数据项,并且System.IO.IOException引发了“Pipe is broken”消息

我做错了什么?

Solutions Collecting From Web of "在C#和Python之间命名pipe道"

好的,我解决了这个问题。 我应该寻求缓冲区的位置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) 

根据MS , ConnectNamedPipe是“接受连接的服务器端函数”。 这就是为什么它永远不会返回 – 它正在等待来自客户端的连接。 这里有一些示例代码显示C#作为服务器和Python作为客户端:

C#:

 NamedPipeserverStream server = new NamedPipeserverStream("Demo"); server.WaitForConnection(); MemoryStream stream = new MemoryStream(); using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write("print \"hello\""); server.Write(stream.ToArray(), 0, stream.ToArray().Length); } stream.Close(); server.Disconnect(); server.Close(); 

蟒蛇:

 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 # prints \rprint "hello" 

我想你是打算使用win32pipe.popen,而不是打开。

另外尝试:pipe.flush(),pipe.read()和time.sleep(0.01)。 有时IPC需要一段时间才能同步。

我真的不知道,这是我的子进程管道的经验。 win32pipe可能会有所不同。