On Apr 2, 1:27 pm, Brian Munroe <[EMAIL PROTECTED]> wrote: > On Apr 2, 12:07 pm, Brian Munroe <[EMAIL PROTECTED]> wrote: > > > > > This gives me ['system1','system2'] - which I can then use __import__ > > on. > > Addendum, thanks Bruno! > > I also required the helper function (my_import) from the Python docs >
You don't need that helper function, which is a little tricky to follow: If you have a module name as a string, you can use the builtin function __import__ to import the module, e.g. x = __import__("mymod") x.myfunc() Note that you have to assign the return value of __import__ to a variable. Thereafter you use the variable to access the module's functions. However, when you use __import__ with a package, it behaves in a peculiar manner: it returns the top level package object. For example, if you write: x = __import__("mypackage.subpack.myfuncs") then x is a reference to mypackage--not mypackage.subpack.myfuncs. In order to execute a function in the module myfuncs, you need to write: x.subpack.myfuncs.f(). Or, if you check the docs, you can make __import__ return the rightmost module in the module string by writing: x = __import__("mypackage.subpack.myfuncs", globals(), locals(), ["subpack.myfuncs"]) The last argument is what makes __import__ return a lower level module in the package hierarchy. To solve your problem, you can do something like the following: Directory structure ------------------- ../mypackage __init__.py /system1 __init__.py myfuncs.py /system2 __init__.py myfuncs.py system1/myfuncs.py ------------ def f(): print "system1 here" system2/myfuncs.py ----------------- def f(): print "system2 here" import sys import os #Get all the file names contained in mypackage: fnames = os.listdir("../mypackage") print fnames #Separate out the directory names(which are the sub packages): os.chdir("../mypackage") #so abspath() below can construct full paths package_dirs = [] for fname in fnames: abs_path = os.path.abspath(fname) #need full path for isdir() print abs_path, if os.path.isdir(abs_path): print 'dir' package_dirs.append(fname) else: print 'file' print package_dirs sys.path.append("../") #directs python to search the specified #dir for any modules that are imported #Import the sub packages: for dir in package_dirs: modname = "%s.%s.%s" % ("mypackage", dir, "myfuncs") modname_minus_toplevel_packname = "%s.%s" % (dir, "myfuncs") mod = __import__(modname, globals(), locals(), [modname_minus_toplevel_packname]) mod.f() --output:-- ['__init__.py', '__init__.pyc', 'system1', 'system2'] /Users/me/2testing/mypackage/__init__.py file /Users/me/2testing/mypackage/__init__.pyc file /Users/me/2testing/mypackage/system1 dir /Users/me/2testing/mypackage/system2 dir ['system1', 'system2'] system1 here system2 here -- http://mail.python.org/mailman/listinfo/python-list