Python:如何导入没有 python-filename 作为子模块的模块?

标签 python python-3.x module python-import

描述

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

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. 如何“组织”我的包,以便可以直接从 abbr.function() 调用 module1.py 中的函数?需要更改哪些代码?
  2. 如果包增长,这个组织有用吗?那么目录将充当结构元素,而 python 文件只是组织我的函数的胶囊?
  3. 在模块和子模块中组织功能的最佳方式是什么?
<小时/>

进一步的想法

  • 是否有充分的理由不在每个 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/

相关文章:

module - 编译Ocaml游戏时未绑定(bind)模块事件错误

python - 这两个Python代码的时间复杂度差异是多少?

使用正则表达式拆分 Python 字符串

windows - 在离线 Windows 机器上安装 Python 包(numpy、scipy、statsmodels 等)

python - 调整 turtle 屏幕大小和保存时出现问题

javascript - 在 React 中使用 fullcalendar v4 导入 rrule 插件

java - 制作模块化 Java Web 应用程序的最佳方法是什么

python - SQLAlchemy 中按子对象的字段排序?

python - 带有鲜花的 Tensorflow 示例

python-3.x - 使用 Bottle.py 提供嵌套的静态文件