[Python-ideas] Provide a way to import module without exec body

Nick Coghlan ncoghlan at gmail.com
Fri Dec 1 03:52:52 EST 2017


On 1 December 2017 at 18:37, Nick Coghlan <ncoghlan at gmail.com> wrote:
> On 1 December 2017 at 18:13, Neil Schemenauer
> <nas-python-ideas at arctrix.com> wrote:
>> I have been working on reducing Python statup time.  It would be
>> nice if there was some way to load a module into memory without exec
>> of its body code.  I'm sure other people have wished for this.
>>
>> Perhaps there could be a new special function, similar to __import__
>> for this purpose.  E.g.  __load_module__().  To actually execute the
>> module, I had the idea to make module objects callable, i.e. tp_call
>> for PyModule_Type.  That's a little too cute though and will cause
>> confusion.  Maybe instead, add a function attribute to modules, e.g.
>> mod.__exec__().
>>
>> I have a little experimental code, just a small step:
>>
>> https://github.com/nascheme/cpython/tree/import_defer_exec
>>
>> We need importlib to give us the module object and the bytecode
>> without doing the exec().
>
> What does actually doing the load give that simply calling
> https://docs.python.org/3/library/importlib.html#importlib.util.find_spec
> doesn't?
>
> At that point, you know the module exists, and how to load it, which
> is all a lazy loading implementations really needs to be confident
> that a subsequent actual execution attempt will be able to start.

After posting this, and while filing
https://bugs.python.org/issue32192, I double checked how
"importlib.util.module_from_spec" works, and it turns out that already
handle the main part of what you're after: it creates the module
without executing it.

The actual execution is then handled by running
"module.__spec__.loader.exec_module(module)".

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia


More information about the Python-ideas mailing list