相对导入问题解决,ImportError:attempted relative import with no known parent package

5 篇文章 0 订阅
3 篇文章 0 订阅

前言

本文中,我将会分析报错 ImportError: attempted relative import with no known parent package 的原因。当运行python脚本,使用了相对引用方式 (类似import module) 去引用包时,可能会出现找不到父级包的异常。想直接看解决方案的朋友,可以直接跳到文章末尾。

问题

以以下目录为例,当从在module2.py文件中运行from .. import dir1时(module1与module2均为自定义的.py文件),python解释器报出以上错误。

.
├── run.py
└── Project
    ├── dir1
    │   └── module1.py 
    ├── dir2
    │   └── module2.py
    └── test.py

为了验证问题,在module2中添加以下代码

print('__file__={0:<35} | __name__={1:<20} | __package__={2:<20}'.format(__file__,__name__,str(__package__)))

运行结果显示: __name__ = __main__ 和 __package__ = None,python解释器没有关于模块所属的包的任何信息,因此它抛出了找不到父级包的异常。

尝试一

我尝试了参考博客2中的解决方案一,在dir1, dir2中创建一个新的空 __init__.py 文件来将项目目录转换为一个包。目录更新如下:

.
├── run.py
└── Project
    ├── dir1
    │   ├── __init__.py
    │   └── module1.py     
    ├── dir2
    │   ├── __init__.py
    │   └── module2.py
    └── test.py

但在分别运行以下两条import代码时,仍然报错。说明问题仍没有解决。

import dir1  #绝对导入
from .. import dir1  #相对导入

尝试二

我又尝试了参考博客1中的方法,添加命令from __future__ import absolute_import, 但是仍报错。

解决方案

尝试了以上两种相对导入的解决方法后,有点儿灰心,决定尝试绝对导入的方法,终于粗暴地把问题解决了。

首先使用python自带的sys模块,查看绝对导入的路径:

import sys
print(sys.path)

发现没有文件dir1,dir2的路径,那么直接在sys.path中添加其路径,即能成功导入了。以我的路径为例:

import sys
print(sys.path)
sys.path.append('/home/user/fqm/Project')
sys.path.append('/home/user/fqm/Project/dir1')
sys.path.append('/home/user/fqm/Project/dir2')
# '/home/user/fqm/'为示例的项目路径,换成你的即可

这样就能正常运行绝对导入import dir1,没有报错了。


参考博客

1,相对导入问题总结:attempted relative import with no known parent package

2,[译][python]ImportError:attempted relative import with no known parent package

3,解决python相对导入出现错误:Attempted relative import beyond toplevel package

  • 39
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
### 回答1: 这个错误通常发生在您在模块中使用相对导入时,但未指定正确的父级包。这可能是因为您忘记在导入语句中指定父级包,或者您正在尝试使用相对导入,但您的模块不在正确的包中。 要解决这个问题,您可以尝试以下几个步骤: 1. 确保您的模块在正确的包中,并且该包已正确安装。 2. 确保您的导入语句使用正确的语法。例如,如果您要相对导入父级包中的模块,则可以使用以下语法:from ..parent_module import module_name。 3. 如果您使用的是 Python 2,您可能需要将相对导入语句更改为绝对导入语句。 4. 如果上述步骤都无法解决问题,请检查您的模块是否存在循环导入。循环导入可能会导致此错误。 如果问题仍然存在,请提供更多的代码和错误消息,以便我们更好地了解问题。 ### 回答2: 在Python中,当我们尝试进行相对导入但却没有已知的父级包时,会产生"ImportError: attempted relative import with no known parent package"错误。 相对导入是指根据当前模块的位置,导入相对于该位置的其他模块。相对导入通常用于在包内部进行模块之间的引用。但是,为了进行相对导入,我们需要在包的上一级目录中有一个已知的父级包。 这个错误通常发生在以下情况中: 1. 当我们将一个单独的Python文件视为主脚本运行时,而不是作为模块导入到其他地方时,会出现该错误。这是因为Python无法确定当前脚本的位置,无法进行相对导入。 2. 在不同的包内使用相对导入时,需要确保在上层包中有一个已知的父级包。如果不存在父级包,Python也无法确定相对导入的目标。 要解决这个错误,我们可以采取以下一些解决方法: 1. 将脚本作为模块导入而不是直接执行。这样可以保证Python能够正确地确定模块的位置。 2. 确保在相对导入的模块所在的包的上级目录中存在一个有效的父级包。 3. 如果需要在不同的包之间进行相对导入,可以考虑使用绝对导入,即使用绝对的包路径来导入模块。 综上所述,导致"ImportError: attempted relative import with no known parent package"错误的原因是Python无法确定相对导入的目标。我们可以通过将脚本作为模块导入、确保有有效的父级包以及使用绝对导入等方法来解决这个错误。 ### 回答3: "ImportError: attempted relative import with no known parent package" 是一个Python的错误提示信息,意为在没有已知父级包的情况下尝试进行相对导入。 这个错误通常发生在使用相对导入语句时没有指定正确的父级包名。相对导入是指在一个包或模块中引用另一个同级或上级的包或模块。在Python中,相对导入需要正确设置父级包的名称。 解决这个错误的方法有以下几种: 1. 使用绝对导入:改为使用绝对导入语句来引用需要的模块或包。绝对导入是指从项目的根目录开始的导入相对于整个项目的完整路径。 2. 将脚本转化为模块:将当前的脚本转换为模块,使其能够具有父级包,然后使用相对导入语句。 3. 设置正确的PYTHONPATH:确保PYTHONPATH环境变量已正确设置,以便Python解释器能够找到相关的模块或包。 4. 检查包结构:检查项目的包结构是否正确,并确保每个包都有一个__init__.py文件,以便被Python解释为一个包。 总之,解决ImportError: attempted relative import with no known parent package”错误的关键是正确设置父级包的名称和项目的包结构。通过使用绝对导入、转化脚本为模块、设置PYTHONPATH环境变量或检查包结构等方法,可以解决这个错误并成功导入所需的模块或包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值