簡體   English   中英

C# 和 Python 之間的命名管道

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM