Именованные каналы между C # и Python

Я пытаюсь создать двухсторонний канал связи между двумя программами (один в 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 Solutions collect form web for “Именованные каналы между C # и Python”

Хорошо, я исправил проблему. Я должен искать положение буфера.

Мой код 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) 

Согласно 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" 

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

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

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

  • UnboundLocalError: локальная переменная 'full_path', на которую ссылаются перед назначением
  • Использование Numpy на разных платформах
  • Ошибка: команда «gcc» не выполнена: нет такого файла или каталога
  • Как найти общую папку данных приложения Windows с помощью Python?
  • Запуск сценария powershell в скрипте python, как заставить python печатать вывод powershell во время его запуска
  • Py2exe: Имеются ли файлы манифеста и w9xpopen.exe при компиляции веб-сервера без интерфейса GUI?
  • Установка Numpy на 64-битной Windows 7 с Python 2.7.3
  • Чтение и / или изменение основного объема Windows 8 в Python
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.