Adds a __repr__ to graph.
[pyutils.git] / src / pyutils / bootstrap.py
index 71bbcd4731c67fca9fecae9f8e8c3dd08b63716b..a8dd5a11bcacc76382d0a9ca2834ed431c453f9b 100644 (file)
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-# © Copyright 2021-2022, Scott Gasch
+# © Copyright 2021-2023, Scott Gasch
 
 """
 If you decorate your main method (i.e. program entry point) like this::
@@ -45,6 +45,7 @@ import os
 import sys
 import uuid
 from inspect import stack
+from typing import NoReturn
 
 from pyutils import config, logging_utils
 from pyutils.argparse_utils import ActionNoYes
@@ -117,6 +118,7 @@ def handle_uncaught_exception(exc_type, exc_value, exc_tb):
     msg = f"Unhandled top level exception {exc_type}"
     logger.exception(msg)
     print(msg, file=sys.stderr)
+    logging_utils.unhandled_top_level_exception(exc_type, exc_value, exc_tb)
     if issubclass(exc_type, KeyboardInterrupt):
         sys.__excepthook__(exc_type, exc_value, exc_tb)
         return
@@ -178,7 +180,7 @@ class ImportInterceptor(importlib.abc.MetaPathFinder):
     def should_ignore_filename(filename: str) -> bool:
         return "importlib" in filename or "six.py" in filename
 
-    def find_module(self, fullname, path):
+    def find_module(self, fullname, path) -> NoReturn:
         raise Exception(
             "This method has been deprecated since Python 3.4, please upgrade."
         )
@@ -298,7 +300,7 @@ def initialize(entry_point):
         entry_descr = None
         try:
             entry_filename = entry_point.__code__.co_filename
-            entry_descr = entry_point.__code__.__repr__()
+            entry_descr = repr(entry_point.__code__)
         except Exception:
             if (
                 "__globals__" in entry_point.__dict__
@@ -306,6 +308,8 @@ def initialize(entry_point):
             ):
                 entry_filename = entry_point.__globals__["__file__"]
                 entry_descr = entry_filename
+        if not entry_filename:
+            entry_filename = 'UNKNOWN'
         config.parse(entry_filename)
 
         if config.config["trace_memory"]:
@@ -327,6 +331,7 @@ def initialize(entry_point):
             sys.maxsize,
             sys.byteorder,
         )
+        logger.debug("Python interpreter path: %s", sys.executable)
         logger.debug("Python interpreter version: %s", sys.version)
         logger.debug("Python implementation: %s", sys.implementation)
         logger.debug("Python C API version: %s", sys.api_version)
@@ -334,7 +339,7 @@ def initialize(entry_point):
             logger.debug("Python interpreter running in __debug__ mode.")
         else:
             logger.debug("Python interpreter running in optimized mode.")
-        logger.debug("Python path: %s", sys.path)
+        logger.debug("PYTHONPATH: %s", sys.path)
 
         # Dump some info about the physical machine we're running on
         # if we're ing debug mode.
@@ -424,10 +429,12 @@ def initialize(entry_point):
         )
 
         # If it doesn't return cleanly, call attention to the return value.
+        base_filename = os.path.basename(entry_filename)
         if ret is not None and ret != 0:
-            logger.error("Exit %s", ret)
+            if not logging_utils.non_zero_return_value(ret):
+                logger.error("%s: Exit %s", base_filename, ret)
         else:
-            logger.debug("Exit %s", ret)
+            logger.debug("%s: Exit %s", base_filename, ret)
         sys.exit(ret)
 
     return initialize_wrapper