Question about import and sys.path

Rob Wolfe rw at smsnet.pl
Tue Nov 28 09:48:14 EST 2006


Frank Millman wrote:
> Hi all
>
> I am writing a business/accounting application. Once a user has logged
> in they are presented with a menu. Each menu option has a description
> and an associated file name and program name. The file name is the name
> of a .py file (impName) and the program name is the name of a class in
> that file which I instantiate to run the program (progName).
>
> When a menu option is selected, I execute the program like this -
>         imp = __import__(impName)
>         app = getattr(imp,progName)()
>
> All the .py files are stored in one directory, which I add to sys.path
> at the beginning of the session. It all seems to work fine.
>
> Now my program directory is getting cluttered, so I want to split it
> into sub-directories, one per company (it is a multi-company system). I
> can do that, and each of the subdirectories can be added to sys.path,
> so it should work as at present.
>
> However, I want the ability to have duplicate program names stored in
> different subdirectories. At the time of selecting the menu option I
> know which company is active, so I know which directory I want to run
> the program from, but there does not seem to be a way to tell 'import'
> to import from a particular directory.

I suggest to use module `imp`.
For example:

I assume paths like this:

app/
     importer.py
     company1/
         prog1.py


the module in the company1 subdirectory:

# prog1
class SomeClass(object):
    def test(self):
        return "%s: %s" % (__file__, self.__class__.__name__)

and the module with your menu could look like this:

# importer.py

def get_class(classname, impname, company):
    fp, pathname, description = imp.find_module(impname, [company])
    m = imp.load_module(impname, fp, pathname, description)
    return getattr(m, classname)

obj = get_class("SomeClass", "prog1", "company1")()
print obj.test()

-- 
HTH,
Rob




More information about the Python-list mailing list