2016-01-17 2 views
0

Я бы хотел передать несколько байтов данных, хотя труба для его построения из python.Окна труб: пишите из C - читайте в Python

Я начал с некоторых фрагментов, которые я нашел здесь, но я не могу заставить их работать.

Я создал трубу, как это:

int main(void){ 

HANDLE hPipe; 
char buffer[24]; 
DWORD dwRead; 


hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\Pipe"), 
         PIPE_ACCESS_DUPLEX | PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 
         PIPE_WAIT, 
         1, 
         24 * 16, 
         24 * 16, 
         NMPWAIT_USE_DEFAULT_WAIT, 
         NULL); 


while (hPipe != INVALID_HANDLE_VALUE) 
{ 
    if (ConnectNamedPipe(hPipe, NULL) != FALSE) // wait for someone to connect to the pipe 
    { 
     while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE) 
     { 
      /* add terminating zero */ 
      buffer[dwRead] = '\0'; 

      /* do something with data in buffer */ 
      printf("%s", buffer); 
     } 
    } 

    DisconnectNamedPipe(hPipe); 
} 

return 0;} 

Если я выполнить следующий код он пишет но часть блоков чтения:

import time 
    import struct 

    f = open(r'\\.\\pipe\\Pipe', 'r+b', 0) 
    i = 1 
    sss='ccccc' 
    while True: 

    s = sss.format(i) 
    i += 1 

    f.write(struct.pack('I', len(s)) + s) # Write str length and str 
    f.seek(0)        # EDIT: This is also necessary 
    print 'Wrote:', s 

    n = struct.unpack('I', f.read(4))[0] # Read str length 
    s = f.read(n)       # Read str 
    f.seek(0)        # Important!!! 
    print 'Read:', s 
    time.sleep(2) 

Я попытался комментирование часть ReadFile в C но это не сработало. Есть ли другой способ достичь этого? Я хочу писать с C и читать с python. Я пробовал писать в трубку с CreateFile (с C), и он работал, как ожидалось. Мне нужна только часть чтения с python.

+1

Труба представляет собой поток данных, который перемещается вперед - вы не можете искать назад к началу потока. –

+0

Что делает 'r + b', (режим, который вы открываете 'f', перед тем, как пытаться написать ему), означает в Python? –

+1

на большинстве систем труб является однонаправленным соединением. один объект пишет, другой читает. если вам нужно двунаправленное соединение, вам понадобятся две трубы. В примере на python вам нужно открыть трубку два раза - для чтения и записи для записи. – furas

ответ

2

На большинстве систем труба однонаправленная, и вы используете две трубы для двунаправленного (двунаправленного) соединения.

В коде Python вы можете открыть два соединения и тогда вам не нужно seek

import time 
import struct 

wf = open(r'Pipe', 'wb', 0) 
rf = open(r'Pipe', 'rb', 0) 

i = 0 
template = 'Hello World {}' 

while True: 

    i += 1 
    text = template.format(i) 

    # write text length and text 
    wf.write(struct.pack('I', len(text))) 
    wf.write(text) 
    print 'Wrote:', text 

    # read text length and text 
    n = struct.unpack('I', rf.read(4))[0] 
    read = rf.read(n) 
    print 'Read:', read 

    time.sleep(2) 

EDIT: протестирован на Linux Mint 17, Python 3.4 & 2,7

+0

Я не мог заставить это работать. Я могу открыть трубу для записи или для чтения, но не для обоих. Он говорит «IOError: [Errno 22] неверный режим или имя файла:« \\\\. \\\\ pipe \\\\ Pipe », когда я пытаюсь открыть второй канал. – papanoel87

+0

Я использую Linux, и это работает - возможно, в других системах есть некоторые проблемы. Я должен был открыть «писать» как первый, потому что он создает канал. – furas

+0

Да, он эффективно работает на linux, но мне нужно использовать окна. Спасибо, в любом случае. – papanoel87

0

Я разрешил его с помощью PyWin32 (http://sourceforge.net/projects/pywin32/files/), который кажется правильным инструментом для окон. Я предпочел бы использовать нечто более ориентированное на cross-plataform, но оно решило проблему.