[Python-Dev] Does Zip Importer have to be Special?

Phil Thompson phil at riverbankcomputing.com
Thu Jul 24 20:12:13 CEST 2014


On 24/07/2014 6:48 pm, Brett Cannon wrote:
> On Thu Jul 24 2014 at 1:07:12 PM, Phil Thompson 
> <phil at riverbankcomputing.com>
> wrote:
> 
>> I have an importer for use in applications that embed an interpreter
>> that does a similar job to the Zip importer (except that the storage 
>> is
>> a C data structure rather than a .zip file). Just like the Zip 
>> importer
>> I need to import my importer and add it to sys.path_hooks. However the
>> earliest opportunity I have to do this is after the Py_Initialize() 
>> call
>> returns - but this is too late because some parts of the standard
>> library have already needed to be imported.
>> 
>> My current workaround is to include a modified version of 
>> _bootstrap.py
>> as a frozen module that has the necessary steps added to the end of 
>> its
>> _install() function.
>> 
>> The Zip importer doesn't have this problem because it gets special
>> treatment - the call to its equivalent code is hard-coded and happens
>> exactly when needed.
>> 
>> What would help is a table of functions that were called where
>> _PyImportZip_Init() is currently called. By default the only entry in
>> the table would be _PyImportZip_Init. There would be a way of 
>> modifying
>> the table, either like how PyImport_FrozenModules is handled or how
>> Inittab is handled.
>> 
>> ...or if there is a better solution that I have missed that doesn't
>> require a modified _bootstrap.py.
>> 
> 
> Basically you want a way to specify arguments into
> importlib._bootstrap._install() so that sys.path_hooks and 
> sys.meta_path
> were configurable instead of hard-coded (it could also be done just 
> past
> importlib being installed, but that's a minor detail). Either way there 
> is
> technically no reason not to allow for it, just lack of motivation 
> since
> this would only come up for people who embed the interpreter AND have a
> custom importer which affects loading the stdlib as well (any reason 
> you
> can't freeze the stdblib as a solution?).

Not really. I'd lose the compression my importer implements.

(Are there any problems with freezing packages rather than simple 
modules?)

> We could go the route of some static array that people could modify.
> Another option would be to allow for the specification of a single 
> function
> which is called just prior to importing the rest of the stdlib,
> 
> The problem with all of this is you are essentially asking for a hook 
> to
> let you have code have access to the interpreter state before it is 
> fully
> initialized. Zipimport and the various bits of code that get loaded 
> during
> startup are special since they are coded to avoid touching anything 
> that
> isn't ready to be used. So if we expose something that allows access 
> prior
> to full initialization it would have to be documented as having no
> guarantees of interpreter state, etc. so we are not held to some API 
> that
> makes future improvements difficult.
> 
> IOW allowing for easy patching of Python is probably the best option I 
> can
> think of. Would tweaking importlib._bootstrap._install() to accept
> specified values for sys.meta_path and sys.path_hooks be enough so that 
> you
> can change the call site for those functions?

My importer runs under PathFinder so it needs sys.path as well (and 
doesn't need sys.meta_path).

Phil


More information about the Python-Dev mailing list