1. 程式人生 > >Python程序間通訊之命名管道(Windows)

Python程序間通訊之命名管道(Windows)

前面文章說了一下 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