Pipes nommées entre C # et Python

J’essaie de créer un canal de communication bidirectionnel entre deux programmes (un en Python et un autre en C #)

Lorsque je crée un canal nommé entre deux programmes C # ou deux programmes Python, tout va bien, mais lorsque j’essaie (par exemple) de me connecter au serveur C # à partir du code Python, cela ne fonctionne pas:

Code C #:

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

Si j’utilise win32pipe en Python, des blocs de code sur ConnectNamedPipe (il ne retourne jamais)

 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) 

Si j’utilise la fonction ouverte, cela établit simplement une connexion, mais rien ne se produit:

 open( '\\\\.\\pipe\\Demo', 'r+b' ) 

Maintenant, si je ferme le programme Python, le serveur C # reçoit un seul élément de données de Python et une System.IO.IOException déclenche avec le message “Pipe is broken”

Est-ce que je fais quelque chose de mal?

OK, j’ai corrigé le problème. Je devrais chercher la position 0 du tampon.

Mon code 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) 

Selon MS , ConnectNamedPipe est la “fonction côté serveur pour accepter une connexion”. C’est pourquoi il ne revient jamais – il attend une connexion d’un client. Voici un exemple de code indiquant C # comme serveur et python comme client:

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(); 

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 # prints \rprint "hello" 

Je pense que vous êtes censé utiliser win32pipe.popen, pas ouvert.

Essayez également: pipe.flush (), pipe.read () et time.sleep (0.01). Parfois, IPC met du temps à se synchroniser.

Je ne sais pas vraiment, c’est mon expérience avec les tuyaux de sous-processus. win32pipe peut être différent.