如何加载文件夹中的所有模块?
有没有人能告诉我一个好的方法来导入整个模块目录呢?
我有这样的结构:
/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"]
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')]