importing modules dynamicly

D

dubux

I am trying to import modules dynamicly from a directory (modules/) in
which i have __init__.py with the __all__ variable set. Everything
imports correctly and I have verified this however I am stuck on
actually using my classes in the dynamicly imported modules.

this bit is in my main.py (or base script) to import the modules in
the modules/ directory:

loaded_modules = []
for item in modules:
if item == '__init__.py': pass
else:
if item.endswith('.py'):
__import__('modules.' + item[0:len(item) - 3])
loaded_modules.append(item[0:len(item) - 3])
else: pass

After loading all the modules, i try to do something like:

instance = modules.modulename.class()

And I get an AttributeError. What am I doing wrong here? Help please!!
 
S

Steven D'Aprano

After loading all the modules, i try to do something like:

instance = modules.modulename.class()

No you don't. class is a reserved word in Python, you would get a
SyntaxError if you did that.

Please post the error you get, including the complete traceback, showing
the line of code that fails. Copy and paste the *actual* message in full,
don't retype it from memory, paraphrase it, simplify it, translate it
into Swahili, or otherwise change it in anyway.
 
J

Jean-Michel Pichavant

dubux said:
I am trying to import modules dynamicly from a directory (modules/) in
which i have __init__.py with the __all__ variable set. Everything
imports correctly and I have verified this however I am stuck on
actually using my classes in the dynamicly imported modules.

this bit is in my main.py (or base script) to import the modules in
the modules/ directory:

loaded_modules = []
for item in modules:
if item == '__init__.py': pass
else:
if item.endswith('.py'):
__import__('modules.' + item[0:len(item) - 3])
loaded_modules.append(item[0:len(item) - 3])
else: pass

After loading all the modules, i try to do something like:

instance = modules.modulename.class()

And I get an AttributeError. What am I doing wrong here? Help please!!
Your code is rather strange, 'modules' looks to be a list or some
iterable, and then you expect to have a 'modulename' attribute or
something...
My guess is that you pasted an approximative translation of your code
which makes it impossible de debug.

Here is a possible way of importing a bunch of python files:

loaded_modules = {}
fileNames = os.listdir('./modules')
pyFiles = [os.path.basename(name).replace('.py', '') for name in
fileNames if name.endswith('.py')]

for pyFile in pyFiles:
loaded_modules[pyFile] = __import__('modules.%s' % pyFile)

# how to get a class named 'AClassName' defined in then modules
for module in loaded_modules:
myClass = getattr(loaded_modules[module], 'AClassName', None)
print myClass
if myClass:
myInstance = myClass()

JM
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,954
Messages
2,570,116
Members
46,704
Latest member
BernadineF

Latest Threads

Top