Young87

当前位置:首页 >个人收藏

【一分钟解决】Python报错ImportError: attempted relative import with no known parent package

ImportError: attempted relative import with no known parent package

关键词

  • 相对导入(relative import)
  • 包(package)

解决方案

明确自己到底在作甚?

  • 是否真的需要相对导入?相对导入使用于包内部,包文件需要通过被其它脚本导入使用,不能单独执行!
    • 当前执行错误的文件是的一个模块吗?如果不是,那么你当前所执行的文件属于普通脚本,应该选择绝对导入借用其它包(目录)或模块(.py文件)的内容;
  • 检查包是否有效
    • 确定包的根目录位置是否存在于包搜索路径sys.path中,你可以通过export PYTHONPATH=$PWD快速添加当前目录(包所在目录)到搜索路径。如为开发中包项目,建议使用 direnv 进行环境管理,如为依赖某些本地代码(包、模块)的脚本文件,建议通过代码添加本地代码所在目录到sys.path
    • 【可选】确认包的目录构成,是否在包和任一子包中的都包含__init__.py文件;

参考链接

Stack Overflow: Relative imports for the billionth time
python3-cookbook: 10.9 将文件夹加入到sys.path

扩展 - 概念明晰

  • 脚本(script):通过执行该文件能够完成某项任务,其中存在必要的任务执行逻辑(一般通过if __name__ == '__main__:'代码块明确任务的整体执行逻辑);
  • 模块(module):以.py作为文件名扩展的单个Python文件,一般由定义不同常量、函数、类而组成,其内容为方便其它模块、脚本进行调用,不存在自身的运行逻辑(也即通过在其它文件中使用import语句进行调用,而非直接通过python *.py运行);
  • 包(package):如果一个目录中存在多个模块,可以通过创建__init__.py文件将该当前目录标识为一个包。若多个模块放置于具有多层嵌套的目录当中,其逻辑关系为包(根目录)-> 子包(子目录)-> 模块(*.py)
  • 绝对导入(absolute import):从包/模块外部,按照目标模块的存在路径从外到内进行导入。示例
    • 单独的模块:import module
    • 模块位于包内部(不存在子包):from package import module
    • 模块位于包内部(存在子包):from package.subpackage import module
  • 相对导入(relative import):位于同一包中的不同子包和模块,可以通过前缀.标识存在调用关系的包/模块之间的路径依赖关系并进行相对调用。示例:
    • 同层目录的模块:from . import module
    • 模块位于同层包内部(不存在子包):from .package import module
    • 模块位于同层包内部(存在子包):from .packge.subpackge import module
    • 模块位于上一层级目录:将以上语句的前缀进行替换from . -> from ..,以此类推

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 金三银四,冰河为你整理了这份20万字134页的面试圣经!!

下一篇: java动态字段排序_Java8对多个字段排序

精华推荐