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

Python子模块:重要错误:尝试相对导入没有已知的父包

端木震博
2023-03-14

我一直在努力与Python上的相对导入。

我的项目结构是这样的:

root_dir
├── main.py
├── Pipfile
├── Pipfile.lock
├── unit_tests
│   ├── __init__.py
│   ├── test_first.py
│   └── test_second.py
└── my_package
    ├── __init__.py
    ├── first.py
    ├── second.py
    └── third.py

我想先将一组函数从位于my\u包中的文件导入test\u。py

根据官方文件,语法应如下所示:

from ..my_package import first

当我这样做时,我会得到以下异常:

Traceback (most recent call last):
  File "/home/user/dev/root_dir/my_package/unit_tests/first.py", line 8, in <module>
    from ..my_package import first
ImportError: attempted relative import with no known parent package

我还尝试使用以下语法导入该文件:

from root_dir.my_package import first

当我这样做时,我会得到以下异常:

ModuleNotFoundError: No module named 'root_dir'

必须指出的是,我正在使用pipenv来处理虚拟环境。知道为什么会这样吗?

谢谢。


共有3个答案

易瀚漠
2023-03-14

我认为问题在于您的根目录不被视为python模块。

为了进行相对导入,您应该将“\uuu init\uuu.py”添加到根目录中。

https://docs.python.org/3/reference/import.html

郑博厚
2023-03-14

当前工作目录不是包。使用os。getcwd()查看它是什么,但它很可能是root\u dir

在这种情况下,您可以直接按名称导入顶级包,而无需相对导入;您应该直接从my_package导入,如下所示:

from my_package import first

...或:

from my_package.first import do_something

复制的文件树:

root_dir
├── main.py
├── my_package
│   ├── __init__.py
│   └── first.py
└── unit_tests
    ├── __init__.py
    └── test_first.py

main.py的内容:

from unit_tests import test_first

if __name__ == "__main__":
    test_first.test_something()

如果您尝试进行相对导入,即:from。。首先导入my_软件包您将获得:

ImportError: attempted relative import beyond top-level package
缪征
2023-03-14

首先,我会给你我用过的代码。然后,我会做一个简单的解释。这里有一个简短的函数,可以让您从根目录导入。

import os, sys

def access_root_dir(depth = 1):
    current_dir = os.path.dirname(os.path.realpath(__file__))
    parent_dir = os.path.dirname(current_dir)
    args: list = [parent_dir]
    for _ in range(depth):
        args.append('..')
    
    rel_path = os.path.join(*args)
    sys.path.append(rel_path) 

# At the top of test_first.py
access_root_dir(2)
import root_dir   

因为根目录是test\u first的祖父母。py,您需要进入深度2:

我在我的一个项目中遇到了同样的问题,发现从父目录的导入是通过修改sys.path来修复的。用类似于sys.path.append(abs_path_to_root)的东西追加根目录的绝对路径似乎不起作用,除非所有内容都是包的一部分。默认情况下,Python不会访问导入中的父目录。

# Case 1: Relative path to parent - works
current_dir = os.path.dirname(os.path.realpath(__file__))
relative_path = os.path.join(current_dir, '..')
sys.path.append(relative_path)
import parent_module_name # This works for me (Python 3.9)

# Case 2: Absolute path to parent - Doesn't work 
current_dir = os.path.dirname(os.path.realpath(__file__))
parent_dir = os.path.dirname(current_dir)
sys.path.append(parent_dir)
import parent_module_name # raises ModuleNotFoundError
 类似资料:
  • 我正在学习用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有人知道问题出在哪里吗?我很困惑,这似乎不起作用,在旧版本中可能吗

  • 我正在使用烧瓶蓝图功能创建模块化应用程序。结果,我的目录结构是这样的: 这里的modules目录不能与Python模块混淆,它们用于为我的项目提供模块化结构(核心模块、foo模块、bar模块等)。现在,模块目录中的每个文件夹(以及其中具有相同名称的模块,如)通过以下操作动态导入到我的主烧瓶应用程序()中: 因此,我无法在模块脚本(如: 因为它给出了一个路径错误,因为整个模块正在项目级别执行,所以我

  • 我有以下目录结构: 火车和实用工具都有 init.py。我正在尝试从火车/主要内部导入utils.logger.py: 但它给出了“未知的父包错误”: 文件"训练/main.py",第4行,从...utils.logger导入记录器重要性错误:尝试相对导入没有已知的父包