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

2024-03-29 02:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的文件结构:

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

我想动态导入dir_adir_a中的每个模块,为了做到这一点,我在dir_a__init__.py中有以下内容:

^{pr2}$

但当我这么做的时候:

from dir_a import *

我得到ImportError: No module named dir_a

我想知道是什么原因造成的,是因为包含dir_a和{}的父目录必须在PYTHONPATH中吗?另外,上面的方法是动态的,只有在my_mod.py运行时它会获取所有内容,但是如果在运行期间向dir_a添加一个新模块,这个新模块就不会被获取。那么,是否有可能实现真正的动态导入机制?在


Tags: 模块文件nofrompyimportmodinit
1条回答
网友
1楼 · 发布于 2024-03-29 02:29:10

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

对于第二部分,我不认为这在一般情况下是不可能的-您可以dir_a中监听“file created”操作系统信号,查看创建的文件是否是.py,并将其添加到dir_a.__all__-但这很复杂,可能很昂贵,并且不会向全局名称空间中追溯新事物,因为from foo import *只能看到导入时foo.__all__中的内容。改变这个很容易出错-它允许您的命名空间根据不可预测的外部事件随时更改。假设你这样做:

from dir_a import *
bar = 5

然后一个bar.py被添加到dir_a。在编写一个“真正动态的导入程序”时,必须考虑到这种情况,并决定您希望发生什么。在

相关问题 更多 >