def not_safe_exec(code, globals_dict, files=None, python_path=None, slug=None): """ Another implementation of `safe_exec`, but not safe. This can be swapped in for debugging problems in sandboxed Python code. This is not thread-safe, due to temporarily changing the current directory and modifying sys.path. """ g_dict = json_safe(globals_dict) with temp_directory() as tmpdir: with change_directory(tmpdir): # Copy the files here. for filename in files or (): dest = os.path.join(tmpdir, os.path.basename(filename)) shutil.copyfile(filename, dest) original_path = sys.path if python_path: sys.path.extend(python_path) try: exec code in g_dict except Exception as e: # Wrap the exception in a SafeExecException, but we don't # try here to include the traceback, since this is just a # substitute implementation. msg = "{0.__class__.__name__}: {0!s}".format(e) raise SafeExecException(msg) finally: sys.path = original_path globals_dict.update(json_safe(g_dict))
def not_safe_exec( code, globals_dict, files=None, python_path=None, limit_overrides_context=None, # pylint: disable=unused-argument slug=None, # pylint: disable=unused-argument extra_files=None, ): """ Another implementation of `safe_exec`, but not safe. This can be swapped in for debugging problems in sandboxed Python code. This is not thread-safe, due to temporarily changing the current directory and modifying sys.path. Note that `limit_overrides_context` is ignored here, because resource limits are not applied. """ g_dict = json_safe(globals_dict) with temp_directory() as tmpdir: with change_directory(tmpdir): # pylint: disable=invalid-name # Copy the files here. for filename in files or (): dest = os.path.join(tmpdir, os.path.basename(filename)) shutil.copyfile(filename, dest) for filename, contents in extra_files or (): dest = os.path.join(tmpdir, filename) with open(dest, "wb") as f: f.write(contents) original_path = sys.path if python_path: sys.path.extend(python_path) try: exec(code, g_dict) # pylint: disable=exec-used except Exception as e: # Wrap the exception in a SafeExecException, but we don't # try here to include the traceback, since this is just a # substitute implementation. msg = "{0.__class__.__name__}: {0!s}".format(e) raise SafeExecException(msg) # pylint: disable=raise-missing-from finally: sys.path = original_path globals_dict.update(json_safe(g_dict))