Python进程间通信之命名管道(Win

发布时间:2019-09-18 07:26:08编辑:auto阅读(2119)

    前面文章说了一下 Linux 命名管道的实现,今天看看 Windows 上我们怎么实现。

    在 Windows 上的命名管道主要是通过调用 win32 api 的以下方法来实现的:
    - win32pipe.CreateNamedPipe()
    - win32pipe.ConnectNamedPipe()
    - win32file.ReadFile()
    - win32file.WriteFile()

    下面看一个例子,比较简单,只是需要注意一下命名管道的命名规则。

    server.py

    import win32file
    import win32pipe
    
    PIPE_NAME = r'\\.\pipe\test_pipe'
    PIPE_BUFFER_SIZE = 65535
    
    while True:
        named_pipe = win32pipe.CreateNamedPipe(PIPE_NAME,
                                               win32pipe.PIPE_ACCESS_DUPLEX,
                                               win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT | win32pipe.PIPE_READMODE_MESSAGE,
                                               win32pipe.PIPE_UNLIMITED_INSTANCES,
                                               PIPE_BUFFER_SIZE,
                                               PIPE_BUFFER_SIZE, 500, None)
        try:
            while True:
                try:
                    win32pipe.ConnectNamedPipe(named_pipe, None)
                    data = win32file.ReadFile(named_pipe, PIPE_BUFFER_SIZE, None)
    
                    if data is None or len(data) < 2:
                        continue
    
                    print 'receive msg:', data
                except BaseException as e:
                    print "exception:", e
                    break
        finally:
            try:
                win32pipe.DisconnectNamedPipe(named_pipe)
            except:
                pass

    client.py

    import win32pipe, win32file
    import time
    
    PIPE_NAME = r'\\.\pipe\test_pipe'
    
    file_handle = win32file.CreateFile(PIPE_NAME,
                                       win32file.GENERIC_READ | win32file.GENERIC_WRITE,
                                       win32file.FILE_SHARE_WRITE, None,
                                       win32file.OPEN_EXISTING, 0, None)
    try:
        for i in range(1, 11):
            msg = str(i)
            print 'send msg:', msg
            win32file.WriteFile(file_handle, msg)
            time.sleep(1)
    finally:
        try:
            win32file.CloseHandle(file_handle)
        except:
            pass

    测试

    • 首先运行server.py
    • 然后运行client.py

关键字