Python:如何将没有python文件名的模块作为子模块导入?

我借

描述

假设我有一个具有以下结构的软件包:

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.

问题

  1. 我如何“组织”我的包,以便可以直接从module1.py中调用函数abbr.function()需要更改哪些代码?
  2. 如果软件包增加,这个组织有用吗?这样目录就可以用作结构元素,而python文件仅仅是在其中组织我的功能的胶囊?
  3. 在模块和子模块中组织功能的最佳方法是什么?

进一步的想法

  • 是否有充分的理由在每个可从模块使用的python文件中不只有一个功能?(并且具有与文件相同的名称)
  • 我想,我将不得不修改我的__init__.py-files,但是我不知道怎么做。

对问题的澄清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__该特殊变量是用户期望在该文件中找到的变量/函数/ etc的列表。

__init__.py @ mypackage

from .module1 import do_stuff1

__all__ = ['do_stuff1']

__init__.py @ subpackage

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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章