解决 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 <module>
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 <module>
import myPackage as pkg
File "c:\Users\akinl\Documents\IError\myPackage\__init__.py", line 1, in <module>
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的情况下进行相对导入所需的所有信息。
相关文章
Python 错误 TypeError: Unsupported Operand Type(s) for +: 'NoneType' and 'Int'
发布时间:2023/07/04 浏览次数:114 分类:Python
-
在 Python 中,当您将整数值与空值相加时,会出现 TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 。 我们将在本文中讨论 Python 错误以及如何解决它。
Python 中错误 ModuleNotFoundError: No Module Named Openpyxl
发布时间:2023/07/04 浏览次数:79 分类:Python
-
本文将讨论 Python 的 No module named 'openpyxl' 错误。 当我们导入的模块未安装或位于另一个目录中时,会出现 ModuleNotFoundError。
Python 错误 Error: Bash: Syntax Error Near Unexpected Token '('
发布时间:2023/07/04 浏览次数:147 分类:Python
-
本篇文章将讨论错误:Bash: syntax error near unexpected token '('。Python 错误:Bash: syntax error near unexpected token '('您的计算机上需要安装 Python,解释器才能查找并运行 Python 文件。
Python 中错误 CSV.Error: Line Contains Null Byte
发布时间:2023/07/04 浏览次数:111 分类:Python
-
在 Python 中创建 CSV 文件 Python 中的 _csv.Error: line contains NULL byte 错误 假设您在尝试读取 CSV 文件时收到 _csv.Error: line contains NULL byte,很可能是因为文件中存在一个或多个 NULL 字节。
Python 中错误 AttributeError: Module Urllib Has No Attribute Request
发布时间:2023/07/04 浏览次数:106 分类:Python
-
Python 将缓存导入,因为您正在使用导入的模块供其自身使用,使其成为对象的一部分。Python 中 AttributeError:module 'urllib' has no attribute 'request' 当您尝试通过导入 URL 库打开 URL 链接时,此错误是
Python 错误 ValueError: Cannot Convert Float NaN to Integer
发布时间:2023/05/31 浏览次数:116 分类:Python
-
本篇文章将介绍如何修复 ValueError: cannot convert float NaN to integer 。使用 fillna() 方法修复python错误 ValueError: cannot convert float NaN to integer
修复 Python 错误TypeError: Missing 1 Required Positional Argument
发布时间:2023/05/31 浏览次数:152 分类:Python
-
本篇文章将讨论 Python 中的 TypeError: missing 1 required positional argument: 'self' 错误以及我们如何解决它。让我们讨论引发此错误的情况。不在 Python 中实例化对象
Python 错误 OverflowError: Python Int Too Large to Convert to C Long
发布时间:2023/05/31 浏览次数:198 分类:Python
-
本篇文章将介绍 Python 中的 OverflowError: python int too large to convert to c long 错误。当算术结果超出数据类型的给定限制时,Python 中会引发 OverflowError。
Python 错误 UnicodeDecodeError: ASCII Codec Can't Decode Byte in Position: Ordi
发布时间:2023/05/31 浏览次数:105 分类:Python
-
在本文中,我们将学习如何解决在代码执行期间发生的 UnicodeDecodeError。 我们将查看导致此错误的不同原因。