Young87

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

【ImportError】: attempted relative import with no known parent package

当你在运行的python脚本。使用了相对引用方式 (类似import …module) 去引用包时,可能会出现这个异常。ImportError: attempted relative import with no known parent package`【尝试相对导入,但不知道父包】。

python解释器是如何解析相关模块

相对导入通过使用模块的 name 属性来确定模块在包层次结构中的位置。如果该模块的名称不包含任何包信息(例如,它被设置为 main ),那么相对引用会认为这个模块就是顶级模块,而不管模块在文件系统上的实际位置。python解释器没有关于模块所属的包的任何信息( __name__ = __main____package__ = None ),因此它抛出了找不到父级包的异常。

解决方法

1,方法一

  • 我们通过在其中创建一个新的空 __init__.py 文件来将项目目录转换为一个包。
  • 我们在项目目录的父目录中创建一个文件 main.py
  • main.py 中导入 project.demos.demo 会设置相对引用的包信息( __name____package__ 变量)。现在,python解释器就可以成功解析 project\demos\demo.py 中的相对引用了。

2,方法二

我们通过在 project 文件夹中创建一个新的空 __init__.py 来将 project 目录转换为一个包。

toplevel 目录下通过 -m 参数来调用python解释器,去执行 project.demos.demo

python -m project.demos.demo

运行该命令将自动设置包信息(__package__变量)。现在,python解释器可以成功解析 project\ demos\demo.py 中的相对引用了(甚至认为 __name __ = __ main__ )。

总结

1、导入需要区分工作目录

在这里插入图片描述

通常在python框架开发时候,发现,在项目目录外层嵌套一个工作目录,目录名称通常和工作目录一致。如果使用编译器打开项目,过多一层或者过少一层打开目录都会导致导入错误,是因为编译器打开那个目录,就将python的工作目录设置那一层,只有上述结构才能实现下面的导入方法

2,. 和 …导入 相对位置是执行文件的当前目录

因为python的相对导入需要用到父级包作为相对的参考位置而这个位置是通过__name__属性和__package__属性进行决定的,当 name 等于 __main__和 package = None的时候导致的问题没有父级包。

3, __init__

Python 2是包的标志,只有拥有__init__文件的目录才会叫做包
python 3也是包的标志,但是不强制识别,py2和py3的__init__文件共有功能,初始化包

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

上一篇: ImportError: attempted relative import with no known parent package---------python框架的路径

下一篇: Trait这个类的特性

精华推荐