def _extract_context(self, tree): ''' Extract content of <script>...</script> from the problem.xml file, and exec it in the context of this problem. Provides ability to randomize problems, and also set variables for problem answer checking. Problem XML goes to Python execution context. Runs everything in script tags. ''' context = {} context['seed'] = self.seed all_code = '' python_path = [] for script in tree.findall('.//script'): stype = script.get('type') if stype: if 'javascript' in stype: continue # skip javascript if 'perl' in stype: continue # skip perl # TODO: evaluate only python for d in self._extract_system_path(script): if d not in python_path and os.path.exists(d): python_path.append(d) XMLESC = {"'": "'", """: '"'} code = unescape(script.text, XMLESC) all_code += code if all_code: try: safe_exec.safe_exec( all_code, context, random_seed=self.seed, python_path=python_path, cache=self.system.cache, slug=self.problem_id, ) except Exception as err: log.exception("Error while execing script code: " + all_code) msg = "Error while executing script code: %s" % str( err).replace('<', '<') raise responsetypes.LoncapaProblemError(msg) # Store code source in context, along with the Python path needed to # run it correctly. context['script_code'] = all_code context['python_path'] = python_path return context
def run_script(self, environment): safe_exec(self._script, environment)