Issue 21737: runpy.run_path() fails with frozen main modules (original) (raw)
The logic in runpy.run_path() assumes that removing the main entry from sys.modules is enough to be able to use the module search logic for e.g. importing packages and ZIP files (with embedded main.py files).
In Python 3.4 (and probably also 3.3 where the importlib was added), this no longer works if a frozen main module is present.
The reason is that the sys.meta_path lists the FrozenImporter before the PathFinder. The runpy trick only works if the PathFinder gets a chance to do its magic, but never gets to play, since the FrozenImporter always returns the existing frozen main module (causing all kinds of strange effects).
Now, looking at the implementation, the frozen main is imported by import.c, not the importlib, so a working solution is to not have the FrozenImporter work on main modules at all.
This then allows the PathFinder to deal with finding the main module in directories or ZIP files and thus allows the hack in runpy to work again.
BTW: In the long run, it would probably better to clean up runpy altogether. It's really messy code due to the many details that it has to address, but I guess this a larger project on its own.