这是树:
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
。但实际上您还导入了 X
和 Y
。虽然您不能通过 X
或 Y
访问它们,但是如果您 import sys
和 sys.modules.keys()
,您可以将这些模块视为 X
和 X.Y
。您可以通过 sys.modules["X.Y"].a 访问
。也就是说Y
中的属性 # 假设有Y
目录下的__init__.py
文件已经执行完毕。
好的,现在如果导入 Y
或 X
也将执行该包下的所有文件,你猜怎么着?是的,即使您只需要 anotherFile
模块,目录 X
下的目录 Y
中的所有文件都将被执行。并且这些文件还导入其他文件等等......只需一次导入,整个项目就被导入了。
关于python - 了解包结构(模块 X.Y 没有属性 Z),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51596097/