Spaces:
Sleeping
Sleeping
import subprocess | |
import time | |
import re | |
import ast | |
# Start the REPL subprocess | |
python_exe = '/Users/18084/Desktop/CS252R/final_project/rasp-env-py3.9/Scripts/python.exe' #SETUP THING: replace with path to your python environment | |
''' | |
THE FOLLOWING FUNCTIONS ARE DEPRECATED | |
''' | |
def clean_carrots(text): | |
pattern = r">>(.*?)>>" | |
match = re.search(pattern, text) | |
if match: | |
result = match.group(1).strip() # .strip() is used to remove any leading/trailing whitespace | |
return result | |
def parse_output(out): | |
out = clean_carrots(out) | |
out = ast.literal_eval(out) | |
# can arrive as tuple, list, or dictionary | |
# ultimately want to convert everything to list form | |
if isinstance(out, dict): | |
return list(out.values()) | |
if isinstance(out, tuple): | |
return list(out) | |
if isinstance(out, list): | |
return list | |
raise Exception("Error executing rasp program.") | |
def run_repl(command): | |
''' | |
Runs the RASP repl in a separate subprocess. | |
''' | |
process = subprocess.Popen([python_exe, 'RASP/RASP_support/REPL.py'], | |
stdin=subprocess.PIPE, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE, | |
text=True) | |
# Send commands to the REPL | |
process.stdin.write(f'{command}\nexit()\n') | |
process.stdin.flush() | |
# Check periodically if the subprocess has terminated | |
while True: | |
if process.poll() is not None: | |
# The subprocess has terminated | |
break | |
time.sleep(0.1) # Wait for a short period (e.g., 0.1 seconds) before checking again | |
# Close the subprocess if still running | |
if process.poll() is None: | |
process.terminate() | |
# Read output and error | |
output = process.stdout.readlines() | |
error = process.stderr.readlines() | |
# Print output and error | |
str_output = "" | |
str_error = "" | |
for line in output: | |
str_output += line.strip() + " " | |
for line in error: | |
str_error += line.strip() + " " | |
str_output = parse_output(str_output) | |
return str_output, str_error | |
if __name__ == "__main__": | |
command = "select(tokens, tokens, ==)(\"hi\");" | |
res, _res_err = run_repl(command) | |
print(res) | |
command = "selector_width(select(tokens, tokens, ==))(\"hi\");" | |
res, _res_err = run_repl(command) | |
print(res) |