gpt4 book ai didi

python - 如何修复这些相对导入错误

转载 作者:行者123 更新时间:2023-12-01 00:52:46 25 4
gpt4 key购买 nike

我有这样的文件夹结构,每次尝试使用相对导入时,都会引发错误

├── graphics
│ ├── __init__.py
│ ├── A
│ │ ├── __init__.py
│ │ ├── grok.py
│ │ └── spam.py
└── B
├── __init__.py
└── bar.py


spam.py/
def func():
pass
bar.py/
def f():
pass

所有这些代码都在 grok.py 中进行了测试:

from . import spam
# ImportError: cannot import name 'spam'

from .spam import func
# ModuleNotFoundError: No module named '__main__.spam'; '__main__'
is not a package

from ..B import bar
# ValueError: attempted relative import beyond top-level package

以下代码均不会导致任何错误:

from graphics.A import spam
from graphics.A.spam import func
from graphics.B import bar
from graphics.B.bar import f

最佳答案

我假设当你说“在 grok.py 中测试”时,你正在像这样运行它:

python3 graphics/A/grok.py
python3 A/grok.py
python3 grok.py

摘自 Packages 上的 Python 文档和 Intra-Package References ,那里有一条注释说:

Note that relative imports are based on the name of the current module. Since the name of the main module is always "__main__", modules intended for use as the main module of a Python application must always use absolute imports.

当您运行grok.py时,它被视为主模块,并且仅当您使用绝对导入时导入才会起作用(假设您没有对 sys.path 进行任何更改,我们稍后会介绍)。您可以通过输入 print(__name__) 来测试它在 grok.py 的开头,它将打印出“__main__ ”。

如果您在调用 main.py 的图形包下有一个单独的 python 文件(例如 grok ),那么您的相对导入实际上将会起作用。模块:

├── graphics
│ ├── __init__.py
| ├── main.py <<---- add this
│ ├── A
│ ├── B

main.py ,让我们导入grok模块:

from A import grok

grok.py ,让我们测试一下相对导入:

from . import spam
spam.spam_func()

from .spam import spam_func
spam_func()

from B import bar
bar.bar_func()

spam.py :

def spam_func():
print("spammy")

bar.py :

def bar_func():
print("barry")

当您运行main.py时:

graphics$ python3 main.py
spammy
spammy
barry

您不会收到之前的任何错误。相对导入有效。请注意,要从 B 导入,我用了from B而不是from ..B 。这是因为导入路径是从main.py的角度来看的。 。您可以通过将其添加到 main.py 的顶部来测试这一点。 :

import sys
print(sys.path)
# prints a list, ['/path/to/graphics/',...]

如果你这样做了from ..B这意味着/path/to/graphics/../这当然没有 B模块(因此,您将收到“尝试相对导入超出顶级包”错误)

<小时/>

现在假设您不想使用单独的 main.py你想运行 grok.py直接地。您可以做的就是手动添加 graphics 的路径包裹至 sys.path 。那么你可以做from Afrom Bgrok.py .

import sys
sys.path.append("/full/path/to/graphics/")

from A import spam
spam.spam_func()

from B import bar
bar.bar_func()

如果你想“破解”sys.path ,我建议阅读更多关于 sys.path 的内容并检查讨论 ways of adding paths to sys.path 的其他相关帖子.

关于python - 如何修复这些相对导入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56452800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com