我有这样的文件结构:
dir_a
__init__.py
mod_1.py
mod_2.py
dir_b
__init__.py
my_mod.py
我想动态导入dir_a
中dir_a
中的每个模块,为了做到这一点,我在dir_a
的__init__.py
中有以下内容:
但当我这么做的时候:
from dir_a import *
我得到ImportError: No module named dir_a
我想知道是什么原因造成的,是因为包含dir_a
和{my_mod.py
运行时它会获取所有内容,但是如果在运行期间向dir_a
添加一个新模块,这个新模块就不会被获取。那么,是否有可能实现真正的动态导入机制?在
问题的第一部分的答案是一个微不足道的“是”:当包含
dir_a
的目录不在搜索路径中时,您不能import dir_a
。在对于第二部分,我不认为这在一般情况下是不可能的-您可以在
dir_a
中监听“file created”操作系统信号,查看创建的文件是否是.py
,并将其添加到dir_a.__all__
-但这很复杂,可能很昂贵,并且不会向全局名称空间中追溯新事物,因为from foo import *
只能看到导入时foo.__all__
中的内容。改变这个很容易出错-它允许您的命名空间根据不可预测的外部事件随时更改。假设你这样做:然后一个
bar.py
被添加到dir_a
。在编写一个“真正动态的导入程序”时,必须考虑到这种情况,并决定您希望发生什么。在相关问题 更多 >
编程相关推荐