描述
假设,我有一个具有以下结构的包:
package-folder
|_ mypackage
|_ __init__.py
|_ module1.py
setup.py
其中__init__.py
为空并且
module1.py
:
def do_stuff():
print('Did stuff.')
setup.py
包含用于制作软件包的常用上下文,可以使用 pip install -e pkgpath
在本地系统上安装该软件包。
在 script.py
中,我必须这样做:
import mypackage as abbr
abbr.module1.do_stuff()
# output: Did stuff.
我想要的电话是:
abbr.do_stuff()
# output: Did stuff.
问题
- 如何“组织”我的包,以便可以直接从
abbr.function()
调用 module1.py 中的函数?需要更改哪些代码? - 如果包增长,这个组织有用吗?那么目录将充当结构元素,而 python 文件只是组织我的函数的胶囊?
- 在模块和子模块中组织功能的最佳方式是什么?
进一步的想法
- 是否有充分的理由不在每个 python 文件中只包含一个可从模块中使用的函数? (并且与文件同名)
- 我想,我必须修改我的
__init__.py
文件,但我不知道如何修改。
问题 2 的澄清
package-folder
|_ mypackage
|_ __init__.py
|_ module1.py #with function do_stuff1()
|_ subpackage
|_module2.py #with function do_stuff2()
setup.py
调用应该是:
abbr.do_stuff1()
abbr.subpackage.do_stuff2()
并且不是:
abbr.module1.do_stuff1()
abbr.subpackage.module2.do_stuff2()
最佳答案
您已经非常接近答案了,您只需从 __init__.py
导入方法即可。
您还可以添加特殊变量__all__
,它是用户可以在该文件中找到的变量/函数/等的列表。
__init__.py
@mypackage
from .module1 import do_stuff1
__all__ = ['do_stuff1']
__init__.py
@子包
from .module2 import do_stuff2
__all__ = ['do_stuff2']
编辑:
要使您的顶级包导入所有子包符号,您可以将 __init__.py
@ mypackage
更改为:
import pkgutil
from .module1 import do_stuff1
__all__ = ['do_stuff']
for loader, name, is_pkg in pkgutil.walk_packages(__path__):
module = loader.find_module(name).load_module(name)
__all__.extend(module.__all__)
for var in module.__all__:
globals()[var] = getattr(module, var)
那么您不仅可以调用 abbr.subpackage.do_stuuf2()
,还可以调用 abbr.do_stuuf2()
。
关于Python:如何导入没有 python-filename 作为子模块的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48208370/