【问题标题】:ImportError attempted relative import with no known parentImportError 尝试在没有已知父项的情况下进行相对导入
【发布时间】:2021-10-20 05:34:42
【问题描述】:

根据一些答案,我尝试更具体。 我想在我的 main.py 中导入打印和模型和代码

我知道这个问题被问了很多,但我仍然无法弄清楚我的代码有什么问题! 我有一个这样的项目目录

-project
   --__init__py
   --main.py
   --print.py
   --requests
        --__init__.py
        --models.py
        --code.py

我想从 print.py 和 * 从请求中导入 因此我尝试在 main.py 中添加这些行

from . import print
#or
import print

#for requests I tried
import os.path
import sys
sys.path.append('./requests')
from requests import *

所有这些行都会导致相同的 ImportError 尝试在没有已知父项的情况下进行相对导入

使用 Python 39 有人知道问题出在哪里吗? 我很困惑,这似乎不起作用,在旧版本中可能吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    你绝对不应该对sys.path 做任何事情。如果您使用的是正确的 Python 包结构,则导入系统应该像这样处理所有事情。

    根据您描述的目录结构,project 将是您的包的名称。所以当你在一些外部代码中使用你的包时,你会这样做

    import package
    

    或使用子模块/子包

    import project.print
    import project.requests
    

    等等。

    对于包内的模块,您可以使用相对导入。当你写

    我想从 print.py 和 * 从请求中导入因此我尝试了

    不清楚从哪里您要导入它们,因为这对于相对导入很重要。

    例如,在project/main.py 中导入您可以使用的print 模块:

    from . import print
    

    但如果它来自project/requests/code.py,你会使用

    from .. import print
    

    顺便说一句,“print”对于模块来说可能不是一个好名字,因为如果你导入 print 模块,它会影响 print() 内置函数。

    【讨论】:

    • 问题是,我想使用项目中的模块,所以将它们导入到 main.py 中。注意:print 不是真名!
    • 所以在main.py 你会使用from . import print 等等。
    • 正如您所写的如何使用相对导入,这正是我想要做的并且不起作用。
    • 我认为您可能需要提供更多详细信息来说明您所做的事情。您在什么代码中编写了您展示的导入语句?
    • 如果您尝试从不在包中的模块进行相对导入,则会出现此错误。
    【解决方案2】:

    您的主文件应位于“项目”目录之外,以便将其用作包。 然后,从您的主文件中,您可以使用 from project.print import ... 导入。

    在项目包中,可以进行相对导入。

    【讨论】:

    • 不一定——他们没有准确解释main.py 是什么或它的用途。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2020-10-13
    • 2020-06-20
    • 2021-10-31
    • 2021-12-19
    • 2020-11-03
    • 2019-07-31
    • 2020-09-22
    相关资源
    最近更新 更多