使用import_module从不同目录导入模块

问题描述

我在一个目录中有一个模块,该模块需要由另一个目录中的脚本导入。但是,每当我尝试导入它时,都会得到一个ModuleNotFoundError。由于位于单独的git repos中,我必须将它们保存在单独的目录中。这是我的文件结构的示例:

└─ Documents
   ├─ ModuleRepo
   │  └─ myModule.py
   └─ ScriptRepo
      └─ myScript.py

脚本myScript.py将模块名称作为命令行参数,然后使用以下命令导入:

import importlib

def dynamic_import(module):
    return importlib.import_module(module)

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('modulename',help='Specify the module to import',type=str)
    args = parser.parse_args()
    
    mymodule = dynamic_import(args.modulename)

如果我导航到Documents/ModuleRepo并尝试运行python3 ../ScriptRepo/myScript.py myModule,则会出现错误ModuleNotFoundError: No module named 'myModule'。如果我将myModule.py移到Documents/ScriptRepo中,那么它将成功运行-所以我猜python仅在正在运行的脚本目录中查找模块。这对我来说尤其奇怪,因为几个月前这种精确的设置对我有用,但现在似乎不起作用。

我的最小目标是能够导航到Documents/ModuleRepo并运行python3 ../ScriptRepo/myScript.py myModule。理想情况下(但不一定),我希望能够使用到myScript.pymyScript.py的相对路径,从任何地方运行myModule.py

我已经使用importlib浏览了许多有关动态导入的现有问题,甚至在今年早些时候问了我自己的一个问题,但是我仍然不知道如何解决在完全独立的目录中包含模块的问题。因此,我们将不胜感激。

解决方法

似乎是路径问题。在myScript.py的最顶部添加:

import sys 
sys.path.append('..')

这应该允许它找到模块。