Python 3.7.0绝对导入失效,运行foo6时报ModuleNotFoundError无foo模块错误
错误原因
你当前把C:\Users\priper\Desktop\dumdum\foo加入了sys.path,而你用from foo.foo1 import ...的语法导入时,Python会遍历sys.path下的所有目录,查找是否存在名为foo的子目录/包。你加入sys.path的foo目录下只有__init__.py、foo1.py、foo6.py三个文件,没有叫foo的子目录,自然找不到foo模块,触发报错。
兼容两种运行场景的修复方案
你需要foo6既可以作为独立脚本运行,也可以被dumdum根目录下的模块正常导入,按以下步骤修改foo6.py即可:
- 修正sys.path添加逻辑:把项目根目录
dumdum加入sys.path,而非foo子目录,这样Python才能定位到foo包 - 适配两种场景的导入写法:用分支判断区分「作为主脚本运行」和「被外部模块导入」两种情况,分别使用对应的导入语法
修改后的foo6.py完整代码如下:
import sys from pathlib import Path if __name__ == "__main__": # 作为主脚本运行时,把dumdum根目录加入sys.path # __file__的父目录是foo,父目录的父目录就是dumdum sys.path.append(str(Path(__file__).parent.parent.resolve())) from foo.foo1 import printy, printing_mystr # 原有业务逻辑 print(__name__) printing_mystr("Oh I am a string passed into foo_1") else: # 被外部模块导入时,使用相对导入 from .foo1 import printy, printing_mystr
验证方法
- 单独运行foo6:直接执行
python foo6.py,可正常输出结果 - 被根目录模块调用:在dumdum目录下新建测试文件
main.py,写入from foo.foo6 import printing_mystr,执行python main.py可正常导入调用
内容的提问来源于stack exchange,提问作者Windy71
相关产品推荐
相关产品推荐

