Implement Python bindings for pipe io client
This commit is contained in:
		
							
								
								
									
										7
									
								
								clients/python/example.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								clients/python/example.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
from pipe_io import PipeIO
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    with PipeIO('in', 'out') as pipeio:
 | 
			
		||||
        pipeio.reader.message_handler = pipeio.writer.send_message
 | 
			
		||||
        pipeio.reader.run()
 | 
			
		||||
							
								
								
									
										69
									
								
								clients/python/pipe_io.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								clients/python/pipe_io.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
from typing import Callable
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PipeReader:
 | 
			
		||||
    def __init__(self, pipe_path):
 | 
			
		||||
        self._pipe = open(pipe_path, 'rb')
 | 
			
		||||
        self._message_handler = lambda msg: None
 | 
			
		||||
 | 
			
		||||
    def __enter__(self):
 | 
			
		||||
        return self
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, type_, value, traceback):
 | 
			
		||||
        self.close()
 | 
			
		||||
 | 
			
		||||
    def close(self):
 | 
			
		||||
        self._pipe.close()
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def message_handler(self):
 | 
			
		||||
        return self._message_handler
 | 
			
		||||
 | 
			
		||||
    @message_handler.setter
 | 
			
		||||
    def message_handler(self, value):
 | 
			
		||||
        if not isinstance(value, Callable):
 | 
			
		||||
            raise ValueError("message_handler must be callable!")
 | 
			
		||||
        self._message_handler = value
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        msg = self.recv_message()
 | 
			
		||||
        while msg:
 | 
			
		||||
            self._message_handler(msg)
 | 
			
		||||
            msg = self.recv_message()
 | 
			
		||||
 | 
			
		||||
    def recv_message(self):
 | 
			
		||||
        return self._pipe.readline()[:-1]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PipeWriter:
 | 
			
		||||
    def __init__(self, pipe_path):
 | 
			
		||||
        self._pipe = open(pipe_path, 'wb')
 | 
			
		||||
 | 
			
		||||
    def __enter__(self):
 | 
			
		||||
        return self
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, type_, value, traceback):
 | 
			
		||||
        self.close()
 | 
			
		||||
 | 
			
		||||
    def close(self):
 | 
			
		||||
        self._pipe.close()
 | 
			
		||||
 | 
			
		||||
    def send_message(self, message):
 | 
			
		||||
        self._pipe.write(message + b'\n')
 | 
			
		||||
        self._pipe.flush()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PipeIO:
 | 
			
		||||
    def __init__(self, in_pipe_path, out_pipe_path):
 | 
			
		||||
        self.reader = PipeReader(in_pipe_path)
 | 
			
		||||
        self.writer = PipeWriter(out_pipe_path)
 | 
			
		||||
 | 
			
		||||
    def __enter__(self):
 | 
			
		||||
        return self
 | 
			
		||||
 | 
			
		||||
    def __exit__(self, type_, value, traceback):
 | 
			
		||||
        self.close()
 | 
			
		||||
 | 
			
		||||
    def close(self):
 | 
			
		||||
        self.reader.close()
 | 
			
		||||
        self.writer.close()
 | 
			
		||||
		Reference in New Issue
	
	Block a user