C# 和 Python 之间的命名管道

Posted

技术标签:

【中文标题】C# 和 Python 之间的命名管道【英文标题】:Named Pipes between C# and Python 【发布时间】:2009-11-17 13:48:02 【问题描述】:

我正在尝试在两个程序(一个在 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 并显示“管道损坏”消息

我做错了什么吗?

【问题讨论】:

这个问题有助于写作this blog post。 【参考方案1】:

根据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"

【讨论】:

这就像一个魅力 :) 感谢您在 8 年后节省了我很多时间 :)【参考方案2】:

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

【讨论】:

【参考方案3】:

我认为你应该使用win32pipe.popen,而不是open。

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

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

【讨论】:

我使用了 win32pipe.popen。没有任何改变 您是否设法在 Python 和 .NET 之间创建了命名管道?我不知道为什么 win32pipe.ConnectNamedPipe(p) 永远不会返回 我也使用了win32file,但是现在连接建立了但是WriteFile不起作用(是的,我也刷新了缓冲区)

以上是关于C# 和 Python 之间的命名管道的主要内容,如果未能解决你的问题,请参考以下文章

在c#中使用命名管道在两个进程之间进行双工操作

C# 服务器和 C++ 客户端之间的命名管道通信

c#命名管道双向通信

C# 中的命名管道输入输出

命名管道性能问题

Windows 中的 python 2 和 python 3 之间的命名管道的工作方式有啥不同吗?