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

2024-04-19 20:53:00 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能给我提供一个导入整个模块目录的好方法吗?
我有一个这样的结构:

/Foo
    bar.py
    spam.py
    eggs.py

我试着通过添加__init__.py并执行from Foo import *来将它转换成一个包,但它并没有像我所希望的那样工作。


Tags: 模块方法frompyimport目录fooinit
3条回答

__all__变量添加到__init__.py中,该变量包含:

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

另见http://docs.python.org/tutorial/modules.html

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

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

2017年更新:您可能希望改用^{}

通过添加__init__.py,使Foo目录成为一个包。在__init__.py中添加:

import bar
import eggs
import spam

由于您希望它是动态的(这可能是个好主意,也可能不是个好主意),请使用list dir列出所有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 *不是一个好主意,有几个原因,包括名称冲突和难以分析代码。

相关问题 更多 >