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

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

我可以通过用 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/

相关文章:

python - 在Python中用正则表达式替换模式的一部分

python - 将高分文件检索到 PyInstaller 创建的 .exe

python - 在 PyQt5 的 TableView 中显示 pandas DataFrame,其中列设置为索引

java - 从 jar 读取资源未按预期工作

c# - 如何使用 MonoDevelop 打包我的 linux 应用程序?

git - 如何以透明的方式从另一个 git 分支获取目录的副本?

ubuntu - 如何在 Debian 打包工作流程中集成远程签名?

Python:是否可以有一个类方法作用于类的一部分?

python - 数据框到python中的文本文件

Debian 打包 : deploying files to the user home directory