diff options
author | TinWoodman92 <chrhodgden@gmail.com> | 2023-06-11 20:44:45 -0500 |
---|---|---|
committer | TinWoodman92 <chrhodgden@gmail.com> | 2023-06-11 20:44:45 -0500 |
commit | a9324ea800301ea4a8fb8cf6b55f18e06104af33 (patch) | |
tree | 584b1e89987eff78530a50e2637ef203b5d7246c /dialoguer/__init__.py | |
parent | 80f13a3c0f80edc3a04c3cfe6befa5b9847f1786 (diff) |
Initial version of dialoguer package.
Diffstat (limited to 'dialoguer/__init__.py')
-rw-r--r-- | dialoguer/__init__.py | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/dialoguer/__init__.py b/dialoguer/__init__.py new file mode 100644 index 0000000..23dd8f2 --- /dev/null +++ b/dialoguer/__init__.py @@ -0,0 +1,84 @@ +import os +import subprocess +import threading +import socket + +HEADER = 256 +PORT = 6011 +SERVER = 'localhost' +ADDR = (SERVER, PORT) +FORMAT = 'utf-8' +DISCONNECT_MESSAGE = b'!DISSCONNECT' + +server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +server.bind(ADDR) + +class Dialogue: + def __init__(self, file_name): + self.file_name = file_name + self.file_path = os.path.join(os.getcwd(), file_name) + self.ext = file_name.split('.')[-1] + self.conn = None + self.addr = None + self.active = False + + def execute_context_script(self): + context_file = __file__.replace('__init__.py', 'context_script.r') + + subprocess.run( + f'Rscript {context_file}', + cwd = os.getcwd(), + start_new_session = True + ) + + def establish_connection(self): + server.listen() + self.conn, self.addr = server.accept() + + def launch_and_connect(self): + self._connect = threading.Thread(target=self.establish_connection) + self._launch = threading.Thread(target=self.execute_context_script) + + self._connect.start() + self._launch.start() + self._connect.join() + + self.send(self.file_path) + msg = self.recv() + self.active = (msg == b'TRUE') + + def open(self, wait = True): + self._open = threading.Thread(target=self.launch_and_connect) + if wait: self._open.run() + else: self._open.start() + + def send(self, msg): + data = bytes(msg, FORMAT) + data += b' ' * (HEADER - len(data)) + self.conn.send(data) + + def recv(self): + msg = self.conn.recv(HEADER).strip() + while msg == b'\x00': + msg = self.conn.recv(HEADER).strip() + return msg + + def import_variable(self, var_name): + self.send(var_name) + val = self.recv() + return val + + def evaluate_expression(self, expr): + pass + + def disconnect_and_close(self): + self.send('!DISCONNECT') + self._launch.join() + self.conn.close() + self.active = False + + def close(self, wait = True): + self._close = threading.Thread(target=self.disconnect_and_close) + if wait: self._close.run() + else: self._close.start() + |