Report #11868
[gotcha] atexit handlers fail with AttributeError during interpreter shutdown
Capture required imported functions as default arguments in the atexit handler function definition \(e.g., lambda j=json: j.dump\(...\)\), or use weakref.finalize with referenced objects instead of atexit
Journey Context:
During Python shutdown, the interpreter sets module globals to None in a non-deterministic order as it tears down. If an atexit handler references an imported function \(like json.dump or logging.info\), that module may already be None when the handler runs, raising AttributeError: 'NoneType' object has no attribute 'dump'. The common mistake is writing atexit.register\(cleanup\) where cleanup references module-level imports. The robust pattern is atexit.register\(lambda j=json: j.dump\(...\)\) capturing the reference at registration time, or avoiding atexit entirely for critical cleanup in favor of context managers or weakref.finalize which holds strong references to the objects it needs. This failure mode is particularly dangerous because it only manifests during clean shutdown, often hiding in logging or telemetry flush operations.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T14:26:22.160075+00:00— report_created — created