From 9e1e928a8419d856285512a34106dc16e7cc7996 Mon Sep 17 00:00:00 2001 From: Lucas Andrade Dias Date: Sun, 31 Mar 2024 22:23:07 -0300 Subject: [PATCH] fixed import error using submodules --- src/outliner/modules/trace.py | 15 +++++++++------ src/outliner/views/module_obj.py | 13 +++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/outliner/modules/trace.py b/src/outliner/modules/trace.py index e689766..26bce70 100644 --- a/src/outliner/modules/trace.py +++ b/src/outliner/modules/trace.py @@ -1,5 +1,7 @@ import sys import collections +import os + from pathlib import Path from ..views import RunningObject @@ -27,6 +29,7 @@ def __init__(self): self.functions_flow = collections.OrderedDict() def _trace_function(self, frame, event, arg): + self.detailed_data[frame.f_code.co_name][str(event)] += 1 self.functions_flow[frame.f_code.co_name] = None self.detailed_data[frame.f_code.co_name]["file"] = Path( @@ -35,22 +38,22 @@ def _trace_function(self, frame, event, arg): self.detailed_data[frame.f_code.co_name][ "start_line" ] = frame.f_code.co_firstlineno - if str(event) == "exception": - raise ExceptionWhileTracing() return self._trace_function def _running_trace(self, obj) -> None: try: instance = obj.instance() + sys.stdout = open(os.devnull, "w") sys.settrace(self._trace_function) instance() - except ExceptionWhileTracing as error: - return - except Exception: - raise Exception("Erro durante execução") + sys.settrace(None) + except Exception as error: + raise (f"Erro durante execução: {str(error)}") finally: sys.settrace(None) + sys.stdout = sys.__stdout__ + return def trace_obj(self, running_obj: RunningObject): if not callable(running_obj): diff --git a/src/outliner/views/module_obj.py b/src/outliner/views/module_obj.py index e336ab5..55ce55a 100644 --- a/src/outliner/views/module_obj.py +++ b/src/outliner/views/module_obj.py @@ -1,6 +1,7 @@ import sys import ast import importlib +import os from importlib import util from pathlib import Path @@ -29,10 +30,22 @@ def __init__( try: importlib.import_module(submodule) except ModuleNotFoundError: + self._try_find_folder_of_submodule(submodule) raise ModuleNotFoundError( f"Could not add the submodule '{submodule}' to the namespace.\n check if the module is installed." ) + def _try_find_folder_of_submodule(self, name: str): + base_path = self.module_path + submodule_as_path = name.replace(".", "/") + for dad_parent in base_path.parents: + pat = Path(str(dad_parent) + "/" + submodule_as_path + ".py") + if pat.is_file(): + sys.path.append(pat) + importlib.import_module(name) + + return True + def _find_imported_modules(self) -> iter: """ A generator with all imports the ast object contains in its namespace