我让我的程序使用importlib
从其他位置导入模块。
此导入的模块(称为 A )导入位于其旁边的其他自定义模块(我们称之为 B )。
My_Project\
│
└─── my_program.py
Some_Other_Location\
│
├─── A_module_my_program_wants_to_import.py
└─── B_module_A_imports.py
当我导入 A 而没有导入它导入 B 时,效果很好:
# Sample from my_program.py
path = Some_Other_Location\A_module_my_program_wants_to_import.py
spec = importlib.util.spec_from_file_location("A", path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
但是,在 A 中,我导入 B :
# Sample from A_module_my_program_wants_to_import.py
import B_module_A_imports
或
from B_module_A_imports import foo
运行程序,我得到:
Build error: No module named 'B_module_A_imports'
追溯到我在程序中的导入位置,并 A
我尝试指定submodule_search_locations=Some_Other_Location
中的spec_from_file_location
,但没有帮助。
所以问题是我如何导入一个远程模块,该模块导入一个本地模块?
答案 0 :(得分:0)
我找到了一种解决方法,但不是正确的解决方案。解决方法如下:
我已经意识到它正在尝试加载my_program所在的 B ,显然没有找到任何东西。但是,可以通过将Some_Other_Location
添加到sys.path
来欺骗加载程序来查找文件。这就是my_program的导入部分的样子:
directory = Some_Other_Location
sys.path.append(directory)
path = Some_Other_Location\A_module_my_program_wants_to_import.py
spec = importlib.util.spec_from_file_location("A", path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.path.remove(directory)
这很好,但是,我仍然可以接受实际的解决方案!