Dynamical loading of modules

Steve Holden steve at holdenweb.com
Tue Oct 4 09:02:47 EDT 2005


Carsten Haese wrote:
> On Tue, 2005-10-04 at 08:32, Steve Holden wrote:
> 
>>Carsten Haese wrote:
>>
>>>On Mon, 2005-10-03 at 17:37, Steve Holden wrote:
>>>
>>>
>>>>Carsten Haese wrote:
>>>>
>>>>
>>>>>On Mon, 2005-10-03 at 16:41, Carsten Haese wrote:
>>>>>
>>>>>
>>>>>
>>>>>>On Mon, 2005-10-03 at 15:52, Jacob Kroon wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>>Hi, I'm having some problems with implementing dynamical module loading. 
>>>>>>>First let me
>>>>>>>describe the scenario with an example:
>>>>>>>
>>>>>>>modules/
>>>>>>>  fruit/
>>>>>>>      __init__.py
>>>>>>>      apple.py
>>>>>>>      banana.py
>>>>>>>
>>>>>>>apple.py defines a class 'Apple', banana defines a class 'Banana'. The 
>>>>>>>problem lies in the
>>>>>>>fact that I want to be able to just drop a new .py-file, for instance 
>>>>>>>peach.py, and not change
>>>>>>>__init__.py, and it should automatically pickup the new file in 
>>>>>>>__init__.py. I've come halfway
>>>>>>>by using some imp module magic in __init__.py, but the problem I have is 
>>>>>>>that the instantiated
>>>>>>>objects class-names becomes fruit.apple.Apple/fruit.banana.Banana, whild 
>>>>>>>I want it to be
>>>>>>>fruit.Apple/fruit.Banana.
>>>>>>>
>>>>>>>Is there a smarter way of accomplishing what I am trying to do ?
>>>>>>>If someone could give me a small example of how to achieve this I would 
>>>>>>>be very grateful.
>>>>>>
>>>>>>How about something like this in fruit/__init__.py:
>>>>>>
>>>>>>import os
>>>>>>
>>>>>>fruit_dir = os.path.dirname(__file__)
>>>>>>fruit_files = [x for x in os.listdir(fruit_dir) if (x[-3:]=='.py' and x!='__init__.py')]
>>>>>>for fruit_file in fruit_files:
>>>>>>module_name = fruit_files[:-3]
>>>>>
>>>>>                 ^^^^^^^^^^^ This should be fruit_file, of course.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>exec "from %s import *" % module_name
>>>>>>
>>>>
>>>>Wouldn't
>>>>
>>>>    __import__(module_name)
>>>>
>>>>be better.
>>>
>>>
>>>I don't see how a working example that meets the OP's requirements can
>>>be constructed using __import__, but that may easily be due to my lack
>>>of imagination. How would you do it?
>>>
>>
>>I was simply suggesting that you replace the exec statement with a call 
>>to __import__(). Wouldn't that work?
> 
> 
> Not the way I tried it by simply replacing my line with your line. (If
> it matters, I'm on python 2.2 here.) First of all, the __import__
> variant doesn't see the submodules unless I add fruit_dir to sys.path.
> Secondly, the OP's requirements are that the classes that the submodules
> implement be imported into fruit's namespace, and I don't see how to
> make __import__ do that.
> 

Please ignore my brainfart and proceed as per your plan :-)

regards
  Steve
-- 
Steve Holden       +44 150 684 7255  +1 800 494 3119
Holden Web LLC                     www.holdenweb.com
PyCon TX 2006                  www.python.org/pycon/



More information about the Python-list mailing list