YongkangZOU commited on
Commit
7d533f2
·
verified ·
1 Parent(s): 8e78869

Delete code_interpreter.py

Browse files
Files changed (1) hide show
  1. code_interpreter.py +0 -281
code_interpreter.py DELETED
@@ -1,281 +0,0 @@
1
- import os
2
- import io
3
- import sys
4
- import uuid
5
- import base64
6
- import traceback
7
- import contextlib
8
- import tempfile
9
- import subprocess
10
- import sqlite3
11
- from typing import Dict, List, Any, Optional, Union
12
- import numpy as np
13
- import pandas as pd
14
- import matplotlib.pyplot as plt
15
- from PIL import Image
16
-
17
- class CodeInterpreter:
18
- def __init__(self, allowed_modules=None, max_execution_time=30, working_directory=None):
19
- """Initialize the code interpreter with safety measures."""
20
- self.allowed_modules = allowed_modules or [
21
- "numpy", "pandas", "matplotlib", "scipy", "sklearn",
22
- "math", "random", "statistics", "datetime", "collections",
23
- "itertools", "functools", "operator", "re", "json",
24
- "sympy", "networkx", "nltk", "PIL", "pytesseract",
25
- "cmath", "uuid", "tempfile", "requests", "urllib"
26
- ]
27
- self.max_execution_time = max_execution_time
28
- self.working_directory = working_directory or os.path.join(os.getcwd())
29
- if not os.path.exists(self.working_directory):
30
- os.makedirs(self.working_directory)
31
-
32
- self.globals = {
33
- "__builtins__": __builtins__,
34
- "np": np,
35
- "pd": pd,
36
- "plt": plt,
37
- "Image": Image,
38
- }
39
- self.temp_sqlite_db = os.path.join(tempfile.gettempdir(), "code_exec.db")
40
-
41
- def execute_code(self, code: str, language: str = "python") -> Dict[str, Any]:
42
- """Execute the provided code in the selected programming language."""
43
- language = language.lower()
44
- execution_id = str(uuid.uuid4())
45
-
46
- result = {
47
- "execution_id": execution_id,
48
- "status": "error",
49
- "stdout": "",
50
- "stderr": "",
51
- "result": None,
52
- "plots": [],
53
- "dataframes": []
54
- }
55
-
56
- try:
57
- if language == "python":
58
- return self._execute_python(code, execution_id)
59
- elif language == "bash":
60
- return self._execute_bash(code, execution_id)
61
- elif language == "sql":
62
- return self._execute_sql(code, execution_id)
63
- elif language == "c":
64
- return self._execute_c(code, execution_id)
65
- elif language == "java":
66
- return self._execute_java(code, execution_id)
67
- else:
68
- result["stderr"] = f"Unsupported language: {language}"
69
- except Exception as e:
70
- result["stderr"] = str(e)
71
-
72
- return result
73
-
74
- def _execute_python(self, code: str, execution_id: str) -> dict:
75
- output_buffer = io.StringIO()
76
- error_buffer = io.StringIO()
77
- result = {
78
- "execution_id": execution_id,
79
- "status": "error",
80
- "stdout": "",
81
- "stderr": "",
82
- "result": None,
83
- "plots": [],
84
- "dataframes": []
85
- }
86
-
87
- try:
88
- exec_dir = os.path.join(self.working_directory, execution_id)
89
- os.makedirs(exec_dir, exist_ok=True)
90
- plt.switch_backend('Agg')
91
-
92
- with contextlib.redirect_stdout(output_buffer), contextlib.redirect_stderr(error_buffer):
93
- exec_result = exec(code, self.globals)
94
-
95
- if plt.get_fignums():
96
- for i, fig_num in enumerate(plt.get_fignums()):
97
- fig = plt.figure(fig_num)
98
- img_path = os.path.join(exec_dir, f"plot_{i}.png")
99
- fig.savefig(img_path)
100
- with open(img_path, "rb") as img_file:
101
- img_data = base64.b64encode(img_file.read()).decode('utf-8')
102
- result["plots"].append({
103
- "figure_number": fig_num,
104
- "data": img_data
105
- })
106
-
107
- for var_name, var_value in self.globals.items():
108
- if isinstance(var_value, pd.DataFrame) and len(var_value) > 0:
109
- result["dataframes"].append({
110
- "name": var_name,
111
- "head": var_value.head().to_dict(),
112
- "shape": var_value.shape,
113
- "dtypes": str(var_value.dtypes)
114
- })
115
-
116
- result["status"] = "success"
117
- result["stdout"] = output_buffer.getvalue()
118
- result["result"] = exec_result
119
-
120
- except Exception as e:
121
- result["status"] = "error"
122
- result["stderr"] = f"{error_buffer.getvalue()}\n{traceback.format_exc()}"
123
-
124
- return result
125
-
126
- def _execute_bash(self, code: str, execution_id: str) -> dict:
127
- try:
128
- completed = subprocess.run(
129
- code, shell=True, capture_output=True, text=True, timeout=self.max_execution_time
130
- )
131
- return {
132
- "execution_id": execution_id,
133
- "status": "success" if completed.returncode == 0 else "error",
134
- "stdout": completed.stdout,
135
- "stderr": completed.stderr,
136
- "result": None,
137
- "plots": [],
138
- "dataframes": []
139
- }
140
- except subprocess.TimeoutExpired:
141
- return {
142
- "execution_id": execution_id,
143
- "status": "error",
144
- "stdout": "",
145
- "stderr": "Execution timed out.",
146
- "result": None,
147
- "plots": [],
148
- "dataframes": []
149
- }
150
-
151
- def _execute_sql(self, code: str, execution_id: str) -> dict:
152
- result = {
153
- "execution_id": execution_id,
154
- "status": "error",
155
- "stdout": "",
156
- "stderr": "",
157
- "result": None,
158
- "plots": [],
159
- "dataframes": []
160
- }
161
- try:
162
- conn = sqlite3.connect(self.temp_sqlite_db)
163
- cur = conn.cursor()
164
- cur.execute(code)
165
- if code.strip().lower().startswith("select"):
166
- columns = [description[0] for description in cur.description]
167
- rows = cur.fetchall()
168
- df = pd.DataFrame(rows, columns=columns)
169
- result["dataframes"].append({
170
- "name": "query_result",
171
- "head": df.head().to_dict(),
172
- "shape": df.shape,
173
- "dtypes": str(df.dtypes)
174
- })
175
- else:
176
- conn.commit()
177
-
178
- result["status"] = "success"
179
- result["stdout"] = "Query executed successfully."
180
-
181
- except Exception as e:
182
- result["stderr"] = str(e)
183
- finally:
184
- conn.close()
185
-
186
- return result
187
-
188
- def _execute_c(self, code: str, execution_id: str) -> dict:
189
- temp_dir = tempfile.mkdtemp()
190
- source_path = os.path.join(temp_dir, "program.c")
191
- binary_path = os.path.join(temp_dir, "program")
192
-
193
- try:
194
- with open(source_path, "w") as f:
195
- f.write(code)
196
-
197
- compile_proc = subprocess.run(
198
- ["gcc", source_path, "-o", binary_path],
199
- capture_output=True, text=True, timeout=self.max_execution_time
200
- )
201
- if compile_proc.returncode != 0:
202
- return {
203
- "execution_id": execution_id,
204
- "status": "error",
205
- "stdout": compile_proc.stdout,
206
- "stderr": compile_proc.stderr,
207
- "result": None,
208
- "plots": [],
209
- "dataframes": []
210
- }
211
-
212
- run_proc = subprocess.run(
213
- [binary_path],
214
- capture_output=True, text=True, timeout=self.max_execution_time
215
- )
216
- return {
217
- "execution_id": execution_id,
218
- "status": "success" if run_proc.returncode == 0 else "error",
219
- "stdout": run_proc.stdout,
220
- "stderr": run_proc.stderr,
221
- "result": None,
222
- "plots": [],
223
- "dataframes": []
224
- }
225
- except Exception as e:
226
- return {
227
- "execution_id": execution_id,
228
- "status": "error",
229
- "stdout": "",
230
- "stderr": str(e),
231
- "result": None,
232
- "plots": [],
233
- "dataframes": []
234
- }
235
-
236
- def _execute_java(self, code: str, execution_id: str) -> dict:
237
- temp_dir = tempfile.mkdtemp()
238
- source_path = os.path.join(temp_dir, "Main.java")
239
-
240
- try:
241
- with open(source_path, "w") as f:
242
- f.write(code)
243
-
244
- compile_proc = subprocess.run(
245
- ["javac", source_path],
246
- capture_output=True, text=True, timeout=self.max_execution_time
247
- )
248
- if compile_proc.returncode != 0:
249
- return {
250
- "execution_id": execution_id,
251
- "status": "error",
252
- "stdout": compile_proc.stdout,
253
- "stderr": compile_proc.stderr,
254
- "result": None,
255
- "plots": [],
256
- "dataframes": []
257
- }
258
-
259
- run_proc = subprocess.run(
260
- ["java", "-cp", temp_dir, "Main"],
261
- capture_output=True, text=True, timeout=self.max_execution_time
262
- )
263
- return {
264
- "execution_id": execution_id,
265
- "status": "success" if run_proc.returncode == 0 else "error",
266
- "stdout": run_proc.stdout,
267
- "stderr": run_proc.stderr,
268
- "result": None,
269
- "plots": [],
270
- "dataframes": []
271
- }
272
- except Exception as e:
273
- return {
274
- "execution_id": execution_id,
275
- "status": "error",
276
- "stdout": "",
277
- "stderr": str(e),
278
- "result": None,
279
- "plots": [],
280
- "dataframes": []
281
- }