从包中导入所有模块

5 投票
2 回答
5297 浏览
提问于 2025-04-18 02:51

我有一个包含多个模块的Python包。

我能做什么:

通过修改这个包里的__init__.py文件,我可以在我的程序中使用包里的所有模块,只需要在里面导入所有模块:

#__init__.py
import module1
import module2

然后我只需在我的程序中导入这个包,就可以通过完整的名称访问所有模块里的类和函数。

#My program
import package
a = package.module1.A()

问题:

有没有办法自动将导入语句添加到__init__.py中,这样我就不需要手动指定它们了?

2 个回答

3

这个初始化文件不是那样工作的……我觉得你可能在想其他的东西……

如果你的文件结构是这样的:

my_program.py
/my_package
    __init__.py
    module1.py
    module2.py

__init__.py 文件里,你可以写这一行代码来改变 import *my_package 中的工作方式。

__all__ = ["module1", "module2"]

现在在 my_program.py 里,你可以这样做:

from my_package import *
a = module1.A()

希望这能帮到你!你可以在这里了解更多信息:https://docs.python.org/2/tutorial/modules.html#importing-from-a-package

3

这是另一个可能更接近你想要的答案。

__init__.py 文件中,你可以添加一些代码来导入这个包里的所有 Python 文件。

注意,这个方法不适用于包,不太确定怎么做。而且我是在 Windows 系统上使用的。

from os import listdir
from os.path import abspath, dirname, isfile, join
# get location of __init__.py
init_path = abspath(__file__)
# get folder name of __init__.py
init_dir = dirname(init_path)
# get all python files
py_files = [file_name.replace(".py", "") for file_name in listdir(init_dir) \
           if isfile(join(init_dir, file_name)) and ".py" in file_name and not ".pyc" in file_name]
# remove this __init__ file from the list
py_files.remove("__init__")

__all__ = py_files

撰写回答