我的目录结构如下所示。
pkg-folder
├── LICENSE
├── pkg-name
│ ├── __init__.py
│ ├── module1
│ │ ├── module1.py
│ │ ├── __init__.py
│ │ └── resourceFile.json
│ └── module2
│ ├── __init__.py
│ └── module2.py
├── README.md
├── setup.py
├── MANIFEST.ini
└── setup.cfg
构建和安装包后,我必须按如下方式导入。
from pkg-name.module1.module1 import func1
当我知道 module1.py 将是子包中的单个文件时,如何直接导入如下?
from pkg-name.module1 import func1
我__init__.py's
的是空白。
您已经部分回答了自己的问题:
我
__init__.py
的是空白的。
导入包时,解释器会检查包__init__.py
文件中的名称绑定。空 __init__.py
文件只为同一目录中的子模块提供名称绑定。例如,如果您有一个像这样的包结构
pkg_folder
└── pkg_name
└── __init__.py
并__init__.py
包含一些定义,例如x = 2
,然后pkg_folder
作为当前工作目录或安装到您的 Python 环境的包,您可以x
使用导入
from pkg_name import x
但是,如果x
在submodule中定义,情况会有所不同。考虑以下包结构:
pkg_folder
└── pkg_name
├── __init__.py
└── module1.py
在这里,import pkg_name
再次告诉解释器检查pkg_name/__init__.py
名称绑定。如果定义x = 2
在module1.py
而不是__init__.py
,那么它不是pkg_name
' 范围的一部分;相反,它属于pkg_name.module1
,因此以下内容将起作用:
from pkg_name.module1 import x
但是,您可以通过使用包相对导入pkg_name
为其定义名称绑定来显式添加它。在这种情况下,可能会阅读:__init__.py
__init__.py
from .module1 import x
其中,由于x
现在定义在 中__init__.py
,因此我们也可以在下面引用它pkg_name
:
from pkg_name import x
相同的逻辑适用于子包中的模块。因此,对于您正在寻找的行为,您需要__init__.py
使用来自子包中其他模块的包相对导入来填充子包的文件。
从
from pkg_name.module1.module1 import func1
至
from pkg_name.module1 import func1
您的pkg_name/module1/__init__.py
文件可能类似于以下内容:
from .module1 import func1
如果你有理由,你甚至可以扩展它以传播func1
到父包。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句