Import folder of modules in Python

2020-03-30 03:09发布

问题:

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.

回答1:

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__.py code 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__.py could 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.



回答2:

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:

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))