当前位置: 首页 > 知识库问答 >
问题:

从Python解释器运行时,获取“重要错误:尝试相对导入,没有已知的父包”

魏襦宗
2023-03-14

我正在使用烧瓶蓝图功能创建模块化应用程序。结果,我的目录结构是这样的:

project
    __init__.py
    config.py
    mould.py
    modules
        __init__.py
        core
            __init__.py
            core.py
            db.py
            models.py

这里的modules目录不能与Python模块混淆,它们用于为我的项目提供模块化结构(核心模块、foo模块、bar模块等)。现在,模块目录中的每个文件夹(以及其中具有相同名称的模块,如core.core)通过以下操作动态导入到我的主烧瓶应用程序mold.py)中:

for item in os.listdir("modules"):
    if not os.path.isfile("modules" + os.sep + item) and not item.startswith("__"):
        ppath = "modules" + "." + item
        fullpath = "modules" + "." + item + "." + item
        module = importlib.import_module(fullpath)
        app.register_blueprint(module.app)
        print("Registered: " + ppath)

因此,我无法在模块脚本(如db)中执行此操作。py

import models

因为它给出了一个路径错误,因为整个模块正在项目级别执行,所以我必须这样做:

from . import models

这解决了问题,我能够成功导入所有模块。但是,当我转到核心模块目录进行一些故障排除并启动python解释器时,它不允许我导入db模块:

>>> import db
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "db.py", line 7, in <module>
    from . import models
ImportError: attempted relative import with no known parent package

有办法解决这个问题吗?那么,我可以在代码和解释器中成功导入db模块吗?

共有2个答案

祁默
2023-03-14

这可能有点过时,但也许其他人会从我的答案中受益。由于python2和python3具有不同的默认导入行为,因此必须确定这两个python版本之间的差异。

Python 2。X导入模型的默认行为是首先查找相对搜索路径顺序,然后查找绝对搜索路径顺序。因此,它应该起作用。

然而,在Python3中。X导入模型的默认行为是仅在绝对路径(称为绝对导入)中查找模型。跳过当前包核心,因为在sys中的任何其他位置都找不到模块db。路径搜索路径,它抛出一个错误。要解决此问题,必须使用带有dotsfrom的import语句。导入模型以明确您正试图从相对目录导入。

如果你有兴趣了解更多关于导入python模块,我建议你从以下关键词开始你的研究:模块搜索路径,python包导入和相对包导入

莫逸仙
2023-03-14

我知道我参加聚会迟到了,但我想我已经找到了解决这个问题的办法。希望这对从事大型Python项目的其他人有用。

诀窍是尝试一种导入格式,如果第一种导入格式失败,则返回到另一种格式。

db。派克

try:
    # Assume we're a sub-module in a package.
    from . import models
except ImportError:
    # Apparently no higher-level package has been imported, fall back to a local import.
    import models

从好的方面来说,这种方法非常简单,但是不能很好地扩展(模块名称是重复的)。可以通过编程方式导入来改进缩放。

db。派克

import importlib

root = 'project.modules.core'
my_modules = ['core', 'models']
for m in my_modules
    try:
        globals()[m] = importlib.import_module(root + '.' + m)
    except ImportError:
        globals()[m] = importlib.import_module(m)

globals()是全局符号表。

当然,现在这个功能需要在每个模块中重复。我不确定这是否真的比第一种方法有所改进。然而,您可以将这个逻辑分离到它自己的独立包中,该包位于pythonpath上的某个地方。

包装箱进口商。派克

import importlib

def import_module(global_vars, root, modules):
    for m in modules
        try:
            global_vars[m] = importlib.import_module(root + '.' + m)
        except ImportError:
            global_vars[m] = importlib.import_module(m)

db。派克

import package_importer

root = 'project.modules.core'
my_modules = ['core', 'models']
package_importer.import_module(globals(), root, my_modules)
 类似资料:
  • 我一直在努力与Python上的相对导入。 我的项目结构是这样的: 我想先将一组函数从位于

  • 我正在学习用python编程,我在从包中的模块导入时遇到了问题。我使用的是Visual studio代码和Python 3.8.2 64位。 我的项目目录 在<code>电子商务/产品中。py文件我有: 这样我就可以从< code > ecommerce/Database . py 文件中导入< code>Database类。但是我出错了

  • 我正在学习使用python编程,并且我在从包中的模块导入时遇到问题。我正在使用Python 3.8.2 64位的Visual Studio代码。 我的项目目录 在电子商务/产品中。py我拥有的文件: 这样我就可以从电子商务/数据库导入数据库类。py文件。但我有个错误

  • 我正在学习fastapi。我有这样一个非常简单的项目结构 内部

  • 根据一些答案,我试图更具体一些。我想在我的main中导入打印、模型和代码。派克 我知道这个问题被问了很多,但是我仍然不知道我的代码有什么问题!我有一个这样的项目目录 我想导入从print.py和*从请求因此,我试图添加这些行在main.py 所有这些行都会导致相同的导入,即在没有已知父项的情况下尝试相对导入, 使用Python 39有人知道问题出在哪里吗?我很困惑,这似乎不起作用,在旧版本中可能吗

  • 因此,我的文件/文件夹结构如下: 在内部,我试图使用以下语法导入:。 我使用的是VSCode,当我键入模块路径时,它甚至会自动完成。但是当我运行文件时,标题中出现了错误。 我在这里读了几十个关于堆栈溢出的答案,但是没有一个使用这样的例子。