我有一个文件夹结构,类似于以下所示的结构:
main_folder
|
---> sub_folder_1
| |
| ---> main_script.py
| |
| ---> side_script.py
|
---> sub_folder_2
| |
| ---> main_script.py
| |
| ---> side_script.py
|
...
即在每个子文件夹中,我都有相同名称的文件。可能会发生这样的情况:对于某些子文件夹,主脚本从侧脚本导入一些对象,只需使用
import side_script
或者
from side_script import *
显然,每个主脚本都引用了同一文件夹中的侧脚本。现在,在完全不同的脚本中,我想要遍历子文件夹,加载主脚本,使用其中的某些内容并保存结果。由于在所有子文件夹中,我想要导入的主文件都以相同的方式命名,因此我需要仔细观察我正在导入哪个文件(来自哪个特定的子文件夹),所以我被建议使用importlib库,逐个加载模块,并使用exec_module()方法。
current_path = r'path\to\next\sub\folder'
spec = importlib.util.spec_from_file_location('main_script', os.path.join(current_path, 'main_script.py'))
executed_module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(executed_module)
只要主脚本不导入侧边脚本,这将能够正常工作。但如果它们导入了侧边脚本,我会遇到以下错误:
ModuleNotFoundError: No module named 'side_module'
显然,当我直接运行任何主脚本时,导入这种类型的内容没有问题——只有在使用exec_module()
方法导入主脚本时才会出现问题。我怀疑这与命名空间有关(exec_module()
在新的命名空间中执行模块),但是我不知道如何使我正在执行的每个主脚本作为一个模块看到同一子文件夹中的脚本,而不改变主脚本本身。
from sub_folder_1.side_script import *
或类似的内容。在使用PyCharm时遇到了类似的问题。建议查阅有关相对导入和绝对导入的资料。 - MePsyDuckModuleNotFoundError: No module named 'sub_folder_1'
。但即使它能够正常工作,我实际上是从外部获取所有子文件夹的内容,我肯定更喜欢避免对它们进行任何修改。 - Jerry