我有这样的文件结构:
dir_a
__init__.py
mod_1.py
mod_2.py
dir_b
__init__.py
my_mod.py
我想动态导入dir_a
中my_mod.py
中的每个模块,为了做到这一点,我在__init__.py
的{{1}}内有以下内容:
dir_a
但是当我这样做时:
import os
import glob
__all__ = [os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(os.path.abspath(__file__)) + "/*.py")]
我得到from dir_a import *
我想知道是什么导致这种情况,是因为包含ImportError: No module named dir_a
和dir_a
的父目录必须在PYTHONPATH中?此外,上述方法仅在dir_b
在运行时获取所有内容的意义上是动态的,但如果在运行期间将新模块添加到my_mod.py
,则不会选择此新模块起来。那么有可能实现真正的动态导入机制吗?
答案 0 :(得分:1)
问题第一部分的答案是微不足道的:当包含import dir_a
的目录不在搜索路径中时,您无法dir_a
。
对于第二部分,我不相信这是可能的 - 你可以在dir_a
中监听'文件创建的'OS信号,看看创建的文件是否是.py
,并将其添加到dir_a.__all__
- 但这很复杂,可能很昂贵,并且不会追溯性地将新内容添加到全局命名空间,因为from foo import *
只能看到foo.__all__
中的内容导入时{1}}。并且更改 会容易出错 - 它允许您的命名空间随时根据不可预测的外部事件进行更改。说你这样做:
from dir_a import *
bar = 5
然后将bar.py
添加到dir_a
。如果不考虑这种情况,你就不能写一个“真正有活力的进口商”,并决定你想要发生什么。