2009-11-17 5 views
4

Je suis en train de créer un canal de communication bidirectionnelle entre deux programmes (un en Python et un autre en C#)canaux nommés entre C# et Python

Lorsque je crée un tube nommé entre deux C# programmes ou deux Python programmes, tout est OK, mais lorsque je tente de (par exemple) se connecter au serveur C# à partir du code Python, il ne fonctionne pas:

code C#:

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

Si je win32pipe en Python, blocs de code sur ConnectNamedPipe (il ne revient 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, il établit simplement une connexion, mais rien ne se produit:

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

Maintenant, si je ferme le programme Python, serveur C# reçoit un seul élément de données de Python et un System.IO.IOException soulève avec le message "Pipe is broken"

Est-ce que je fais quelque chose de mal?

+0

Cette question aidé par écrit [ce blog] (http://jonathonreinhart.blogspot.com/2012/12/named-pipes-between-c-and-python.html). –

Répondre

1

OK, j'ai résolu le problème. Je devrais chercher à la position 0 du tampon.

code Python My:

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

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

Essayez également: pipe.flush(), pipe.read() et time.sleep (0.01). Parfois, l'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.

+0

J'ai utilisé win32pipe.popen. Rien n'a changé Avez-vous réussi à créer un canal nommé entre Python et .NET? Je ne sais pas pourquoi win32pipe.ConnectNamedPipe (p) ne retourne jamais –

+0

J'ai aussi utilisé win32file, mais maintenant la connexion s'établit mais WriteFile ne fonctionne pas (Oui, j'ai aussi vidé la mémoire tampon) –

1

Selon MS, ConnectNamedPipe est la fonction "côté serveur pour accepter une bonne connexion". C'est pourquoi il ne revient jamais - il attend une connexion d'un client. Voici quelques exemples de code montrant 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" 
Questions connexes