From 2ba0cb24dc84fae271d6466f00cc082cc8c44a4e Mon Sep 17 00:00:00 2001 From: Mike Kelly Date: Fri, 14 Apr 2023 16:39:29 +0100 Subject: [PATCH] execute python via shell if already running in a container --- scripts/execute_code.py | 103 ++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 46 deletions(-) diff --git a/scripts/execute_code.py b/scripts/execute_code.py index dbd62c226591..45263d02af94 100644 --- a/scripts/execute_code.py +++ b/scripts/execute_code.py @@ -19,53 +19,60 @@ def execute_python_file(file): if not os.path.isfile(file_path): return f"Error: File '{file}' does not exist." - try: - client = docker.from_env() - - image_name = 'python:3.10' + if we_are_running_in_a_docker_container(): + result = subprocess.run(f'python {file_path}', capture_output=True, encoding="utf8", shell=True) + if result.returncode == 0: + return result.stdout + else: + return f"Error: {result.stderr}" + else: try: - client.images.get(image_name) - print(f"Image '{image_name}' found locally") - except docker.errors.ImageNotFound: - print(f"Image '{image_name}' not found locally, pulling from Docker Hub") - # Use the low-level API to stream the pull response - low_level_client = docker.APIClient() - for line in low_level_client.pull(image_name, stream=True, decode=True): - # Print the status and progress, if available - status = line.get('status') - progress = line.get('progress') - if status and progress: - print(f"{status}: {progress}") - elif status: - print(status) - - # You can replace 'python:3.8' with the desired Python image/version - # You can find available Python images on Docker Hub: - # https://hub.docker.com/_/python - container = client.containers.run( - image_name, - f'python {file}', - volumes={ - os.path.abspath(WORKSPACE_FOLDER): { - 'bind': '/workspace', - 'mode': 'ro'}}, - working_dir='/workspace', - stderr=True, - stdout=True, - detach=True, - ) - - output = container.wait() - logs = container.logs().decode('utf-8') - container.remove() - - # print(f"Execution complete. Output: {output}") - # print(f"Logs: {logs}") - - return logs - - except Exception as e: - return f"Error: {str(e)}" + client = docker.from_env() + + image_name = 'python:3.10' + try: + client.images.get(image_name) + print(f"Image '{image_name}' found locally") + except docker.errors.ImageNotFound: + print(f"Image '{image_name}' not found locally, pulling from Docker Hub") + # Use the low-level API to stream the pull response + low_level_client = docker.APIClient() + for line in low_level_client.pull(image_name, stream=True, decode=True): + # Print the status and progress, if available + status = line.get('status') + progress = line.get('progress') + if status and progress: + print(f"{status}: {progress}") + elif status: + print(status) + + # You can replace 'python:3.8' with the desired Python image/version + # You can find available Python images on Docker Hub: + # https://hub.docker.com/_/python + container = client.containers.run( + image_name, + f'python {file}', + volumes={ + os.path.abspath(WORKSPACE_FOLDER): { + 'bind': '/workspace', + 'mode': 'ro'}}, + working_dir='/workspace', + stderr=True, + stdout=True, + detach=True, + ) + + output = container.wait() + logs = container.logs().decode('utf-8') + container.remove() + + # print(f"Execution complete. Output: {output}") + # print(f"Logs: {logs}") + + return logs + + except Exception as e: + return f"Error: {str(e)}" def execute_shell(command_line): @@ -86,3 +93,7 @@ def execute_shell(command_line): os.chdir(current_dir) return output + + +def we_are_running_in_a_docker_container(): + os.path.exists('/.dockerenv')