gpt4 book ai didi

python - 从兄弟目录导入 Python 类

转载 作者:行者123 更新时间:2023-11-28 21:46:22 26 4
gpt4 key购买 nike

我在 /VM/repo/project 中的目录结构是:

__init__.py

scripts/
getSomething.py
__init__.py

classes/
project.py
db.py
__init__.py

getSomething.py

from ..classes import project
from ..classes import db

项目.py

class PROJECT:
def __init__(self):
stuff

数据库.py

class DB:
def __init__(self):
stuff

当我尝试运行时

python getSomething.py

我得到了错误

Traceback (most recent call last):
File "scripts/getSomething.py", line 4, in < module >
from ..classes import project
ValueError: Attempted relative import in non-package

我在这里错过了什么?

最佳答案

如错误中所述,您正在将 getSomething 作为主模块运行。但是当你不在一个包中时,你不能做包相关导入。主模块从不在包中。因此,如果您要将 getSomething 作为包的一部分导入...:

# /VM/repo/main.py
from project.scripts import getSomething

那么你就不会有导入错误了。


快速讨论 python 模块和包可能会有所帮助。通常,包含 python 源代码并具有 .py 扩展名的文件是一个模块。通常该模块的名称是文件的名称(无扩展名),但如果您直接运行它,该模块的名称是 '__main__'。到目前为止,这都是众所周知的并有据可查。要导入模块,您只需执行 import moduleimport package.module 等等。最后一个导入语句指的是我们现在要讨论的其他东西(“包”)......

包是您可以导入的目录。许多目录无法导入(例如,它们可能没有 python 源文件——模块——在其中)。所以要解决这个歧义,还有一个要求就是目录要有一个__init__.py文件。当您在文件系统上导入目录时,python 实际上会导入 __init__.py 模块,并根据 __init__.py 中的内容创建相关包(如果有的话)。

将所有这些放在一起说明了为什么在具有 __init__.py 的目录中执行文件不足以让 python 将模块视为包的一部分。首先,模块的名称是__main__,而不是package.filename_sans_extension。其次,包的创建不仅取决于文件系统结构,还取决于目录(因此 __init__.py 是否实际导入)。

您可能会问自己“他们为什么要这样设计?”事实上,我有时也问过自己同样的问题。我认为这是因为语言设计者希望为包提供某些保证。包应该是为特定目的而设计的一组事物。它不应该是一个脚本孤岛,凭借一些随意的 __init__.py 文件获得在文件系统中走动以找到他们需要的其他模块的能力。如果某些东西被设计成作为主模块运行,那么它可能不应该成为包的一部分。相反,它应该是一个单独的模块,导入包并依赖它。

关于python - 从兄弟目录导入 Python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38082774/

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