Title: runpy.run_path() fails with frozen __main__ modules
Type: Stage:
Components: Interpreter Core Versions: Python 3.5, Python 3.4
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: brett.cannon, eric.snow, lemburg, ncoghlan
Priority: normal Keywords: patch

Created on 2014-06-12 16:24 by lemburg, last changed 2014-06-12 16:54 by berker.peksag.

File name Uploaded Description Edit
FrozenImporter-without-__main__-support.patch lemburg, 2014-06-12 16:25 Patch implementing this idea for Python 3.4.1
Messages (1)
msg220364 - (view) Author: Marc-Andre Lemburg (lemburg) * (Python committer) Date: 2014-06-12 16:24
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 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.
Date User Action Args
2014-06-12 16:54:49berker.peksagsetnosy: + brett.cannon, ncoghlan, eric.snow
2014-06-12 16:25:41lemburgsetfiles: + FrozenImporter-without-__main__-support.patch
keywords: + patch
2014-06-12 16:24:20lemburgcreate