I'm trying to debug an issue that causes sys.modules['numpy']
to get overwritten. I've added some print statements to numpy.__init__
, and when I try to import numpy, I get this output:
numpy.__init__ running
id(sys.modules) = 89034704
id(sys.modules['numpy']) = 161528304
numpy.__init__ running
id(sys.modules) = 89034704
id(sys.modules['numpy']) = 177135864
Numpy has a number of circular imports, which should work as described in this answer. But in my case, instead of getting the partially initialized numpy module from sys.modules
, numpy gets imported again, and numpy.__init__
gets executed a second time, leading to a crash.
How can I instrument sys.modules
to get some visibility into who is overwriting sys.modules['numpy']
and when? Normally I would write a dict subclass, but I don't think it's safe to change sys.modules
to point to my own object. I tried overriding sys.modules.__setattr__
, but that's a read-only attribute.
Context: I'm trying to debug this issue in PyCall, a Julia library. PyCall embeds a Python interpreter in a running Julia process, and delegates the import to PyImport_ImportModule
from cpython. The problem above happens inside a single call to PyImport_ImportModule
, so I hope this question should be answerable with knowledge of python / cpython, but without knowledge of Julia / PyCall.