gpt4 book ai didi

python - 了解包结构(模块 X.Y 没有属性 Z)

转载 作者:太空宇宙 更新时间:2023-11-04 04:36:26 26 4
gpt4 key购买 nike

这是树:

X
|_ setup.py
|_ X
|_ someFile.py
|_ __init__.py (empty)
|_ Y
|_ __init__.py (empty)
|_ anotherFile.py

运行 pip install -e . 后,我可以在系统的任何位置运行以下命令:

import X
from X import someFile
from X.Y import anotherFile

但是我不能运行:

from X import Y
Y.anotherFile

-> Module X.Y has no attribute "anotherFile".

我可以通过用 from X.Y import anotherFile 填充较低级别的 __init__.py 来解决这个问题,但这似乎有点奇怪。

这是为什么呢?我对 python 包的理解有误吗?

免责声明:之前可能有人问过这个问题,但这个问题太笼统了,我很难找到合适的帖子。

最佳答案

其实很简单。对于 from X import Y,导入的模块是目录 Y 中的 __init__.py 文件,但不是所有其他文件。

但我认为真正的问题是,为什么?

假设 anotherFile 是您唯一需要的模块,因此您可以通过 from X.Y import anotherFile 导入 anotherFile。但实际上您还导入了 XY。虽然您不能通过 XY 访问它们,但是如果您 import syssys.modules.keys(),您可以将这些模块视为 XX.Y。您可以通过 sys.modules["X.Y"].a 访问 Y 中的属性 # 假设有。也就是说Y目录下的__init__.py文件已经执行完毕。

好的,现在如果导入 YX 也将执行该包下的所有文件,你猜怎么着?是的,即使您只需要 anotherFile 模块,目录 X 下的目录 Y 中的所有文件都将被执行。并且这些文件还导入其他文件等等......只需一次导入,整个项目就被导入了。

关于python - 了解包结构(模块 X.Y 没有属性 Z),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51596097/

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