Python模块内部导入Modules目录模块出现ModuleNotFoundError报错
报错原因
你在外部脚本可以正常导入是因为运行外部脚本时,脚本所在的项目根目录会被自动加入Python的模块搜索路径sys.path;当你直接运行模块内部的脚本时,Python只会将当前运行脚本所在的子目录加入搜索路径,无法定位到Modules目录的父级路径,因此找不到对应的模块。
另外注意:如果你的目录名是首字母大写的Modules,Linux/macOS等大小写敏感的系统下,导入语句写全小写的modules也会触发报错,需要保持大小写一致。
解决方案
你可以根据自己的使用场景选择对应方案:
场景1:内部脚本仅作为模块被外部导入,不需要单独运行
使用相对导入即可,根据你当前脚本和目标模块的相对位置调整层级即可,比如当前脚本在Modules/utils目录下,要导入config.database,就写成:from ..config.database import *其中
..代表上一级目录,多嵌套一层就多加一个.。场景2:需要单独运行内部脚本
方案一:在脚本开头手动将项目根目录加入搜索路径,示例代码如下(根据脚本嵌套深度调整os.path.dirname的嵌套层数,确保最终拿到的是Modules所在的根目录的绝对路径):import sys import os # 示例为脚本在Modules下两层子目录的写法,层级更多就多加一层os.path.dirname sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))方案二:以模块的方式运行脚本,不要直接执行py文件。回到项目根目录后,用
-m参数运行,比如要运行Modules/test.py就执行:python -m Modules.test场景3:长期开发该项目,希望一劳永逸解决路径问题
将项目根目录的绝对路径添加到系统的PYTHONPATH环境变量中,配置完成后Python运行任意脚本都会搜索该路径下的模块,导入语句不需要做任何修改。
内容的提问来源于stack exchange,提问作者Zebco
相关产品推荐
相关产品推荐

