解决 python中 attempted relative import with no known parent package 错误
python 中的相对导入可能很棘手,尤其是在处理单个目录中的多个模块时。 根据您设计 python 代码库的方式,您可能会遇到 importerror。
但是,对导入系统的充分了解足以防止此类错误,包括 importerror: attemptsrelative import with noknownparent package。 通过错误消息可以轻松排除问题的根源。
在这种情况下,这是因为父包不存在。 本文展示并解释了如何解决 importerror 问题。
使用 submodules 解决python中的 importerror: attempted relative import with no known parent package
当我们使用 .module_name 表达式(如下面的代码所示)时,会出现错误 importerror:尝试在没有已知父包的情况下进行相对导入。
import .module_name
让我们通过在新目录中创建三个文件来重现该问题。 您可以使用下面的结构来测试它。
ierror 目录包含所有 python 代码,mypackage 目录包含所有包文件。
ierror/
mypackage/
__init__.py
mynewpackage.py
main.py
要重新创建错误消息,我们只需要 __init__.py
文件。 __init__.py
文件让 python 解释器知道某个目录包含 python 模块代码,在本例中为 mynewpackage.py。
在重新创建错误之前,让我们编写将包含在所有三个 python 文件中的代码。
在 mynewpackage.py 文件中,存在以下代码片段:
def createsingledict(name, value):
return {"name": name, "value": value}
__init__.py
文件:
from .mynewpackage import createsingledict
main.py 文件,它使用 mypackage 模块:
import mypackage as pkg
user = pkg.createsingledict("jacob", 25)
print(user)
mynewpackage.py 包含一个函数,该函数接受两个参数并返回传递参数的字典。 __init__.py
使用 import 语句和关键字 from 和 import 将 mynewpackage.py 导入到 __init__.py
文件中。
main.py 导入 mypackage 而不使用 mypackage.mynewpackage 表达式。 由于子模块,所有这些都是可能的。
__init__.py
文件及其中的语句加载子模块机制,其中 mynewpackage 文件(属性)绑定到父 (mypackage) 命名空间。
__init__.py
文件中语句的关键部分是模块名称之前的点。 这允许绑定到父模块的放置。
请记住错误消息中没有已知父包的部分。 这就是您遇到错误的原因。
让我们只运行 init.py 文件。 执行的输出如下。
traceback (most recent call last):
file "c:\users\akinl\documents\ierror\mypackage\__init__.py", line 1, in
from .mynewpackage import createsingledict
importerror: attempted relative import with no known parent package
发生此错误的原因是我们在没有父命名空间 mypackage 上下文的情况下运行 __init__.py
文件。 但是,如果我们使用 import 语句运行 main.py,将 mypackage 作为 pkg 导入,则不会出现任何错误。
输出如下所示:
{'name': 'jacob', 'value': 25}
因此,不要使用 . 除非在 __init__.py
或父命名空间的绑定或上下文中,否则在 module_name 之前添加运算符,以防止出现 importerror: attempted relative import with no known parent package。
为了更好地了解发生了什么,如果删除 . 如果在 __init__.py
的 import 语句中使用了运算符,我们在运行该文件时不会出现任何错误。
from mynewpackage import createsingledict
但是,如果我们运行 main.py 文件,则会导致以下错误,因为我们尚未将 mynewpackage 模块绑定到父模块 mypackage。
traceback (most recent call last):
file "c:\users\akinl\documents\ierror\tempcoderunnerfile.py", line 1, in
import mypackage as pkg
file "c:\users\akinl\documents\ierror\mypackage\__init__.py", line 1, in
from mynewpackage import createsingledict
modulenotfounderror: no module named 'mynewpackage'
为了使代码运行,我们必须使用 . main.py 中的 import 语句中的运算符并删除(删除) __init__.py
文件。
import mypackage.mynewpackage as pkg
user = pkg.createsingledict("jacob", 25)
print(user)
然而,这很麻烦,并且使用 . __init__.py
中的运算符,但始终确保在父上下文中运行它。
如果您有两个子模块,则其工作方式相同。 新的子模块 otherpackage.py 可能包含以下代码:
def printname(name):
print("the user's name is " name)
您更新 __init__.py
文件以将新子模块绑定到父命名空间。
from .mynewpackage import createsingledict
from .otherpackage import printname
在 main.py 中,您必须使用别名 pkg 来访问其他子模块中的函数。 这就是绑定到父命名空间的美妙之处,即易于导入。
import mypackage as pkg
user = pkg.createsingledict("jacob", 25)
print(user)
pkg.printname("jacob")
代码的输出:
{'name': 'jacob', 'value': 25}
the user's name is jacob
有了所有这些,您就拥有了在python 代码库中防止或解决 importerror: attempted relative import with no known parent package的情况下进行相对导入所需的所有信息。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
发布时间:2023/07/09 浏览次数:173 分类:python
-
我们将通过示例介绍python中何时出现 address already in use 错误以及如何解决。python 中的错误address already in use 本文将讲述运行使用端口的程序时发生的python堆栈错误。
发布时间:2023/07/09 浏览次数:607 分类:python
-
在本篇文章中,我们的目标是探索解决 python 中的 valueerror: math domain error 错误的不同方法。当编码方面数学(基础或高级)的使用存在固有缺陷时,python 中通常会引发 valueerror: math domain error 错
python 错误 name xrange is not defined
发布时间:2023/07/09 浏览次数:153 分类:python
-
本篇文章将介绍如何解决 python 中 name 'xrange' is not defined 的错误。解决python中name 'xrange' is not defined错误 让我们尝试理解为什么会发生这个特定的错误。 让我们首先尝试复制这个问题。
python 错误 typeerror: list indices must be integers, not str
发布时间:2023/07/09 浏览次数:954 分类:python
-
在本篇文章中,我们的目标是探索如何避免 typeerror: list indices must be integers or slices, not str。typeerror主要发生在python中,每当操作的数据类型出现问题时。
发布时间:2023/07/09 浏览次数:2241 分类:python
-
在 python 中,attributeerror 是在未定义 __enter__ 函数的情况下通过 with 语句使用类的对象时导致的错误。
python 错误 modulenotfounderror: no module named '_ctypes'
发布时间:2023/07/09 浏览次数:686 分类:python
-
本篇文章旨在了解如何解决 python 中的 modulenotfounderror: no module named '_ctypes'。了解python中 modulenotfounderror: no module named '_ctypes' 根本原因
发布时间:2023/07/09 浏览次数:1063 分类:python
-
本篇文章将介绍如何修复 python 中的 attributeerror: '_io.textiowrapper' object has no attribute 'split'。在 _io.textiowrapper 上使用 split() 方法会返回 attributeerror
python 错误 attributeerror: _csv.reader object has no attribute next
发布时间:2023/07/09 浏览次数:286 分类:python
-
本篇文章将介绍如何修复 python 中的 attributeerror: '_csv.reader' object has no attribute 'next'。修复 python 中的 attributeerror: '_csv.reader' object has no attribute 'next' 错误
python 错误 error: invalid command bdist_wheel
发布时间:2023/07/09 浏览次数:847 分类:python
-
在 python 中构建 wheel 时,有时 setup.py 可能会退出并出现错误 invalid command 'bdist_wheel'。 本篇文章将讨论在 python 中解决此问题的可能ag捕鱼王app官网的解决方案。安装wheel包来修复python中 error:invalid command 'bdist_