问题描述
我在一个目录中有一个模块,该模块需要由另一个目录中的脚本导入。但是,每当我尝试导入它时,都会得到一个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.py
和myScript.py
的相对路径,从任何地方运行myModule.py
。
我已经使用importlib
浏览了许多有关动态导入的现有问题,甚至在今年早些时候问了我自己的一个问题,但是我仍然不知道如何解决在完全独立的目录中包含模块的问题。因此,我们将不胜感激。
解决方法
似乎是路径问题。在myScript.py的最顶部添加:
import sys
sys.path.append('..')
这应该允许它找到模块。