如何加载文件夹中的所有模块?

366 投票
22 回答
437676 浏览
提问于 2025-04-15 12:33

有没有人能告诉我一个好的方法来导入整个模块目录呢?
我有这样的结构:

/Foo
    bar.py
    spam.py
    eggs.py

我试着通过添加一个 __init__.py 文件来把它变成一个包,然后用 from Foo import * 来导入,但结果并没有像我希望的那样工作。

22 个回答

78

2017年的更新:你可能想用importlib来代替。

要把Foo这个文件夹变成一个包,你需要在里面添加一个__init__.py文件。在这个__init__.py文件里添加:

import bar
import eggs
import spam

因为你想要动态加载(这可能是个好主意,也可能不是),你可以用列出目录的方式来列出所有的.py文件,然后用类似下面的方式导入它们:

import os
for module in os.listdir(os.path.dirname(__file__)):
    if module == '__init__.py' or module[-3:] != '.py':
        continue
    __import__(module[:-3], locals(), globals())
del module

然后,在你的代码中这样做:

import Foo

现在你可以通过以下方式访问这些模块:

Foo.bar
Foo.eggs
Foo.spam

等等。from Foo import *这样做不是个好主意,原因有很多,包括可能会出现名字冲突,以及让代码分析变得困难。

159

__init__.py 文件中添加一个 __all__ 变量,内容包括:

__all__ = ["bar", "spam", "eggs"]

另外可以参考 http://docs.python.org/tutorial/modules.html

496

列出当前文件夹中的所有 Python (.py) 文件,并将它们放入 __init__.py 文件中的 __all__ 变量里。

from os.path import dirname, basename, isfile, join
import glob
modules = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')]

撰写回答