【ImportError】: attempted relative import with no known parent package
日期: 2019-08-07 分类: 个人收藏 437次阅读
当你在运行的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这个类的特性
精华推荐