简体   繁体   中英

Import folder of modules in Python

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.

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.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM