Python:如何导入没有pythonfilename作为子模块的模块?

2024-09-22 20:36:35 发布

您现在位置: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. 如何“组织”我的包,以便直接从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()

Tags: 模块文件函数pyinitsetupfunctiondo
1条回答
网友
1楼 · 发布于 2024-09-22 20:36:35

你已经很接近答案了,你只需要从__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()。你知道吗

相关问题 更多 >