Dynamical loading of modules

Steve Holden steve at holdenweb.com
Tue Oct 4 14:32:00 CEST 2005


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?

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