0

我有这样的文件结构:

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

我想动态导入 in 中的每个模块,dir_a为了my_mod.py做到这一点,我在__init__.pyof 中有以下内容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并且dir_b必须在 PYTHONPATH 中吗?此外,上述方法仅在my_mod.py运行时获取所有内容的意义上是动态的,但如果dir_a在运行期间添加新模块,则不会获取该新模块。那么有没有可能实现真正的动态导入机制呢?

4

1 回答 1

1

您问题第一部分的答案是微不足道的:import dir_a当包含的目录dir_a不在搜索路径中时,您不能。

对于第二部分,我认为这通常是不可能的——你可以在 中监听“文件创建”的 OS 信号,dir_a查看创建的文件是否为不会追溯性地将新事物添加到全局命名空间,因为只在导入时查看其中的内容。并且更改很容易出错 - 它允许您的命名空间根据不可预测的外部事件随时更改。假设你这样做:.pydir_a.__all__from foo import *foo.__all__

from dir_a import *
bar = 5

然后将 abar.py添加到dir_a. 如果不考虑这种情况并决定要发生什么,您就无法编写“真正动态的导入器”。

于 2012-06-15T15:46:07.637 回答