动态导入给定目录/包中的每个模块

时间:2012-06-15 15:32:08

标签: python import importerror

我有这样的文件结构:

dir_a
    __init__.py
    mod_1.py
    mod_2.py
dir_b
    __init__.py
    my_mod.py

我想动态导入dir_amy_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_adir_a的父目录必须在PYTHONPATH中?此外,上述方法仅在dir_b在运行时获取所有内容的意义上是动态的,但如果在运行期间将新模块添加到my_mod.py,则不会选择此新模块起来。那么有可能实现真正的动态导入机制吗?

1 个答案:

答案 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。如果不考虑这种情况,你就不能写一个“真正有活力的进口商”,并决定你想要发生什么。