在Python中导入模块的文件夹

时间:2011-10-21 15:00:18

标签: python module import

在python中是否可以从文件夹/包中获取模块列表并导入它们?

我希望能够从类中的函数执行此操作,以便整个类可以访问它们(可能通过__init__方法完成)。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

请参阅modules document

  

唯一的解决方案是让包作者提供一个明确的   包的索引。 import语句使用以下内容   约定:如果包的__init__.py代码定义了一个名为的列表   __all__,它被视为遇到包import *时应导入的模块名称列表。这取决于   包的作者在新版本的时候保持这个列表是最新的   包发布。包裹作者也可能决定不支持   它,如果他们没有看到从他们的包中导入*的用途。对于   例如,文件sound / effects / __init__.py可以包含   以下代码:

__all__ = ["echo", "surround", "reverse"]
     

这意味着从sound.effects import *将导入声音包的三个命名子模块。

是的,您可以通过为目录中的文件创建目录列表并手动导入它们来找到一种方法。但是你没有内置的语法。

答案 1 :(得分:0)

您可以使用dir函数

了解模块列表
import module
dir (module)

稍后在程序中,您可以导入单个函数:

from module import function

答案 2 :(得分:0)

distribute模块提供了一种机制,可以完成大部分工作。首先,您可以首先使用pkg_resources.resource_listdir列出python文件:

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

然后,您可以在循环中导入每个模块:

modules = {}
for module in module_names:
    modules[module] = __import__('.'.join('sqlalchemy', module))