Jump to content
  • Advertisement
Sign in to follow this  
CoMaNdore

python module loading

This topic is 4653 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

note: I re wrote this post to make it easier to answer. Okay after seaching around the net for a while I tought I had found the golden egg. But it turns out that it wont work the way I want it to work. Problem: I want to load a module based on a absulute path ( or relative to the module ). But I cant.. Say I have a module named loader.py in "test"'s directory. inside test there is also a folder named "data". Inside data there is 2 files named "loadme.py" and "importme.py"
data/
     loader.py
     
     data/
          loadme.py
          importme.py
Now as I said I thought had found the golden egg: ModulesAsPlugins - http://wiki.python.org/moin/ModulesAsPlugins The problem is that each time I run the example found in the above article like this: (and belov)
# in loader.py
modules = [load_module(name) for name in find_modules("data")];

# I get this error:
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in ?
    modules = [load_module(name) for name in find_modules("data")];
  File "C:\Coding\MyProjects\MazeRunner\loadtest\loader.py", line 35, in load_module
    (file, pathname, desc) = imp.find_module( name, path );
ImportError: No module named loadme
Can anybody point out for me what I am doing wrong? For those of you that are laszy I copied my code:
#
# Loader
#


import os
import sets
import imp

def find_modules( path="." ):
    """ Return names of modules in a directory """


    modules = sets.Set();
    for filename in os.listdir(path):
        module = None;

        if filename.endswith( ".py" ):
            module = filename[:-3];
        elif filename.endswith( ".pyc" ):
            module = filename[:-4];


        if module != None:
            modules.add( module );


    return list(modules);



def load_module( name, path=["."] ):
    """Return a named module found in a given path."""

    (file, pathname, desc) = imp.find_module( name, path );
    return( imp.load_module(name, file, pathname, desc ) );


modules = [load_module(name) for name in find_modules("data")];

[Edited by - CoMaNdore on January 21, 2006 6:57:36 AM]

Share this post


Link to post
Share on other sites
Advertisement
Do you have documentation for the imp module? I don't think it's standard, is it? The error is in that, so the documentation for it would be a good place to start.

Anyway, here's my speculation: notice that you pass a path to find_module, but omit it for load_module. Try this instead:

modules = [load_module(name, "data") for name in find_modules("data")];

Share this post


Link to post
Share on other sites
Kylotan, your little 'hint' fixed the code... it now works like
a charm. :D

Anwyay some info: the imp module is a standard module.
it is used to access the internal's of the import statement.

And to help out other that may have the same problem that I had here is the
now working complete code:


#
# modloader.py
#
#


import os
import sets
import imp

def LoadModules( path ):
""" Load all modules in @path. Return a dict with modules """
ret = {};
for mod in find_modules( path ):
ret[mod] = load_module(name, [path]);

return( ret );

def LoadModule( name, path = "." ):
""" Load a single module spesified by @name and @path """

for mod in find_modules( path ):
if mod == name:
return( load_module(name, [path]) );

return( None );


def find_modules( path="." ):
""" Return names of modules in a directory """


modules = sets.Set();
for filename in os.listdir(path):
module = None;


if filename.endswith( ".py" ):
module = filename[:-3];
elif filename.endswith( ".pyc" ):
module = filename[:-4];


if module != None:
modules.add( module );


return list(modules);



def load_module( name, path=["."] ):
"""Return a named module found in a given path."""

(file, pathname, desc) = imp.find_module( name, path );
return( imp.load_module(name, file, pathname, desc ) );






Thanks for the help!

[Edited by - CoMaNdore on January 22, 2006 11:32:56 AM]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!