Именованные каналы между C # и Python - PullRequest
5 голосов
/ 17 ноября 2009

Я пытаюсь создать двусторонний канал связи между двумя программами (одна на Python, а другая на C #)

Когда я создаю именованный канал между двумя программами C # или двумя программами Python, все в порядке, но когда я пытаюсь (например) подключиться к серверу C # из кода Python, это не работает:

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( '\\\\.\\pipe\\Demo', 'r+b' )

Теперь, если я закрою программу Python, сервер C # получает только один элемент данных от Python и System.IO.IOException вызывает сообщение «Pipe is broken»

Я что-то не так делаю?

Ответы [ 3 ]

3 голосов
/ 08 декабря 2010

Согласно 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"
1 голос
/ 18 ноября 2009

ОК, я исправил проблему. Я должен искать в позиции 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)
0 голосов
/ 17 ноября 2009

Я думаю, вы должны использовать win32pipe.popen, а не открывать.

Также попробуйте: pipe.flush (), pipe.read () и time.sleep (0.01). Иногда для синхронизации IPC требуется некоторое время.

Я действительно не знаю, это мой опыт с каналами подпроцесса. win32pipe может отличаться.

...