为什么 from . import *
不会导入子模块
在 Python 中,from . import *
并不会自动导入子模块。这是因为 import *
的行为是由模块的 __all__
变量决定的。如果没有定义 __all__
,它只会导入当前模块中定义的顶层变量和函数,而不会递归地导入子模块。
解决方法
-
显式导入子模块:
在__init__.py
文件中显式导入你希望包含的子模块。例如:from . import test print('初始化mytest')
-
使用
__all__
:
如果你仍然希望使用from . import *
,你可以在__init__.py
文件中定义__all__
变量,明确指定要导入的子模块:__all__ = ['test'] print('初始化mytest')
然后在使用
from . import *
时,Python 会根据__all__
的定义导入test
模块。
示例
假设你的文件结构如下:
/mnt/d/python_proj ├── my.py └── mytest├── __init__.py└── test.py
-
mytest/test.py:
def myfun():print("This is myfun in test module")
-
mytest/init.py(显式导入子模块):
from . import test print('初始化mytest')
或者使用
__all__
:__all__ = ['test'] print('初始化mytest')
-
my.py:
import mytest mytest.test.myfun()
通过这种方式,你可以确保 test
模块被正确导入,并且可以在 my.py
中使用 mytest.test.myfun()
。