Windows管道:从C写入 - 用Python读取

时间:2016-01-17 06:01:08

标签: python c pipe named-pipes

我希望通过管道传输几个字节的数据,以便从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)

我尝试在C代码中评论ReadFile部分,但它没有用。有没有其他方法来实现这一目标?我想用C语言编写并从python中读取。我尝试使用CreateFile(来自C)写入管道,它按预期工作。我只需要用python读取部分。

2 个答案:

答案 0 :(得分: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)

编辑:在Linux Mint 17,Python 3.4& 2.7

答案 1 :(得分:0)

我用PyWin32(http://sourceforge.net/projects/pywin32/files/)解决了这个问题,它似乎是Windows的正确工具。我宁愿使用更多面向跨平台的东西,但它已经解决了这个问题。