我如何导入一个远程模块,即一个本地模块?

时间:2019-09-03 14:51:19

标签: python import python-importlib

我让我的程序使用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,但没有帮助。

所以问题是我如何导入一个远程模块,该模块导入一个本地模块?

1 个答案:

答案 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)

这很好,但是,我仍然可以接受实际的解决方案!