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/ -- http://mail.python.org/mailman/listinfo/python-list