fix: execute js/py code (#129)

This commit is contained in:
sigoden
2024-11-25 08:21:58 +08:00
committed by GitHub
parent 4e0c6e752d
commit ecf7233401
2 changed files with 28 additions and 8 deletions
+5 -2
View File
@@ -12,8 +12,11 @@ exports.run = function run({ code }) {
if (callback) callback();
};
eval(code);
const value = eval(code);
if (value !== undefined) {
output += value;
}
process.stdout.write = oldStdoutWrite;
return output;
}
+23 -6
View File
@@ -1,16 +1,33 @@
import ast
import io
import sys
from contextlib import redirect_stdout
def run(code: str):
"""Execute the python code.
Args:
code: Python code to execute, such as `print("hello world")`
"""
old_stdout = sys.stdout
output = io.StringIO()
sys.stdout = output
with redirect_stdout(output):
value = exec_with_return(code, {}, {})
exec(code)
if value is not None:
output.write(str(value))
sys.stdout = old_stdout
return output.getvalue()
return output.getvalue()
def exec_with_return(code: str, globals: dict, locals: dict):
a = ast.parse(code)
last_expression = None
if a.body:
if isinstance(a_last := a.body[-1], ast.Expr):
last_expression = ast.unparse(a.body.pop())
elif isinstance(a_last, ast.Assign):
last_expression = ast.unparse(a_last.targets[0])
elif isinstance(a_last, (ast.AnnAssign, ast.AugAssign)):
last_expression = ast.unparse(a_last.target)
exec(ast.unparse(a), globals, locals)
if last_expression:
return eval(last_expression, globals, locals)