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

时间:2018-07-30 14:19:39

标签: python packaging

这是树:

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".

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

那是为什么?我对python软件包的理解错了吗?

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

1 个答案:

答案 0 :(得分:1)

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

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

假设anotherFile是您想要的唯一模块,因此您可以通过anotherFile导入from X.Y import anotherFile。但是实际上您还导入了XY。尽管您无法通过XY访问它们,但是如果您使用import syssys.modules.keys(),则可以将这些模块视为XX.Y 。并且您可以通过Y访问sys.modules["X.Y"].a # suppose there is中的属性。这意味着目录__init__.py下的Y文件已执行。

好,所以现在,如果导入YX还将执行该程序包下的所有文件,您猜怎么着?是的,即使您只需要anotherFile模块,也会执行目录Y下的所有文件,包括目录X。这些文件还可以导入其他文件,依此类推...仅需一次导入,就可以导入整个项目。