diff options
| author | Scott Gasch <[email protected]> | 2022-02-09 22:18:59 -0800 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2022-02-09 22:18:59 -0800 |
| commit | c974b8cde11f133df7680967b759772c624007e9 (patch) | |
| tree | 9d6e60f8cd2317c4b836ca65696d956b644a7bc1 /bootstrap.py | |
| parent | 804988efe7c8b131fc0c4b30088de2b5c5bd0b74 (diff) | |
More spring cleaning.
Diffstat (limited to 'bootstrap.py')
| -rw-r--r-- | bootstrap.py | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/bootstrap.py b/bootstrap.py index 3574786..50af844 100644 --- a/bootstrap.py +++ b/bootstrap.py @@ -1,5 +1,11 @@ #!/usr/bin/env python3 +"""This is a module for wrapping around python programs and doing some +minor setup and tear down work for them. With it, you can break into +pdb on unhandled top level exceptions, profile your code by passing a +commandline argument in, audit module import events, examine where +memory is being used in your program, and so on.""" + import functools import importlib import logging @@ -101,6 +107,15 @@ def handle_uncaught_exception(exc_type, exc_value, exc_tb): class ImportInterceptor(importlib.abc.MetaPathFinder): + """An interceptor that always allows module load events but dumps a + record into the log and onto stdout when modules are loaded and + produces an audit of who imported what at the end of the run. It + can't see any load events that happen before it, though, so move + bootstrap up in your __main__'s import list just temporarily to + get a good view. + + """ + def __init__(self): import collect.trie @@ -111,9 +126,9 @@ class ImportInterceptor(importlib.abc.MetaPathFinder): def repopulate_modules_by_filename(self): self.module_by_filename_cache.clear() - for mod in sys.modules: - if hasattr(sys.modules[mod], '__file__'): - fname = getattr(sys.modules[mod], '__file__') + for _, mod in sys.modules.copy().items(): # copy here because modules is volatile + if hasattr(mod, '__file__'): + fname = getattr(mod, '__file__') else: fname = 'unknown' self.module_by_filename_cache[fname] = mod @@ -243,8 +258,7 @@ def initialize(entry_point): # Maybe log some info about the python interpreter itself. logger.debug( - 'Platform: %s, maxint=0x%x, byteorder=%s', - sys.platform, sys.maxsize, sys.byteorder + 'Platform: %s, maxint=0x%x, byteorder=%s', sys.platform, sys.maxsize, sys.byteorder ) logger.debug('Python interpreter version: %s', sys.version) logger.debug('Python implementation: %s', sys.implementation) @@ -320,7 +334,12 @@ def initialize(entry_point): 'child system: %.4fs\n' 'machine uptime: %.4fs\n' 'walltime: %.4fs', - utime, stime, cutime, cstime, elapsed_time, walltime + utime, + stime, + cutime, + cstime, + elapsed_time, + walltime, ) # If it doesn't return cleanly, call attention to the return value. |
