Is it possible in python to get a list of modules from a folder/package and import them?
I would like to be able to do this from a function inside a class, so that the entire class has access to them (possibly done from the __init__ method).
Any help would be greatly appreciated.
3 Answers 3
See the modules document.
The only solution is for the package author to provide an explicit index of the package. The import statement uses the following convention: if a package’s
__init__.pycode defines a list named__all__, it is taken to be the list of module names that should be imported when from package import * is encountered. It is up to the package author to keep this list up-to-date when a new version of the package is released. Package authors may also decide not to support it, if they don’t see a use for importing * from their package. For example, the file sounds/effects/__init__.pycould contain the following code:__all__ = ["echo", "surround", "reverse"]This would mean that from sound.effects import * would import the three named submodules of the sound package.
Yes, you could find a way to do this by doing a directory listing for the files in the directory and import them manually. But there isn't built-in syntax for what you're asking.
Comments
You can know the list of the modules with the dir function
import module
dir (module)
Later in a program, you can import a single function :
from module import function
3 Comments
dir(foo) (with foo being a package) I get ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] which doesn't contain a list of the modules in the package.>>> type(dir(sys)) <type 'list'>__init__.py file of the package's directory). The modules for the package are only included in this list if they are explicitly stated in the __all__ variable.The distribute module provides a mechanism that does much of this. First, you might start by listing the python files in a package using pkg_resources.resource_listdir:
>>> module_names = set(os.path.splitext(r)[0]
... for r
... in pkg_resources.resource_listdir("sqlalchemy", "/")
... if os.path.splitext(r)[1] in ('.py', '.pyc', '.pyo', '')
... ) - set(('__init__',))
>>> module_names
set(['engine', 'util', 'exc', 'pool', 'processors', 'interfaces',
'databases', 'ext', 'topological', 'queue', 'test', 'connectors',
'orm', 'log', 'dialects', 'sql', 'types', 'schema'])
You could then import each module in a loop:
modules = {}
for module in module_names:
modules[module] = __import__('.'.join('sqlalchemy', module))
from package import *anddir(package)insufficient? Note thatdiris a Python command, as well as a command line one.['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']without any mention of the modules inpackage.dirshows the modules if the modules themselves are explicitly imported, though, but that defeats the purpose of the question.__init__.pyfile in the folder? Even empty, this is what tells python to treat the folder as a module.__init__.py. What I didn't have is what @MarkHildreth helpfully referenced: the line__all__ = ['bar','baz']in__init__.py.