8

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

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

C#代码:

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

如果我win32pipe在 Python 中使用,代码块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会出现“管道损坏”消息

我做错什么了吗?

4

3 回答 3

10

根据MSConnectNamedPipe是“接受连接的服务器端功能”。这就是它永远不会返回的原因——它正在等待来自客户端的连接。下面是一些示例代码,显示 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();
}

Python:

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"
于 2010-12-08T17:47:53.607 回答
1

好的,我解决了这个问题。我应该寻求缓冲区的位置 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)
于 2009-11-18T11:48:00.637 回答
0

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

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

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

于 2009-11-17T14:47:28.167 回答