在C#和Python之间命名管道

时间:2009-11-17 13:48:02

标签: c# python windows named-pipes

我正在尝试在两个程序之间创建一个双向通信通道(一个在Python中,另一个在C#中)

当我在两个C#程序或两个Python程序之间创建命名管道时,一切正常,但是当我尝试(例如)从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)

如果我使用open函数,它只是建立一个连接,但什么也没发生:

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

现在,如果我关闭Python程序,C#服务器只接收来自Python的一个数据项,并且System.IO.IOException引发“管道已损坏”消息

我做错了吗?

3 个答案:

答案 0 :(得分:2)

根据MSConnectNamedPipe是“接受连接的服务器端功能”。这就是为什么它永远不会返回 - 它正在等待来自客户端的连接。这里有一些示例代码,显示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"

答案 1 :(得分:1)

好的,我解决了这个问题。我应该寻求缓冲区的位置。

我的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)

答案 2 :(得分:0)

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

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

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