首页 > 解决方案 > 一次导入子模块,以便它可用于所有其他子模块和顶级模块

问题描述

我的任务是研究对 Python 工具的改进。然而,目前的工具是一团糟。只是几百个函数和导入的集合,分布在同级目录中的 10 个文件中,所有文件都相互交叉引用,每个文件导入其他文件的一些子集,有时是递归的。

那里有一个底层的层次结构,所以我打算把它全部转换成一个带有子模块的模块,然后进一步将它重构为一个类而不是一组嵌套函数。

我在进口方面遇到了一些问题。我是使用 python 自学的,并且我试图保持 PEP8 兼容,但对如何操作知之甚少。另一个复杂因素是我使用的系统是安全的,并且无法在其上安装 IDE,因此我正在与内置终端的美化文本编辑器作斗争。

我以为我可以在模块的最高级别将子模块一起导入,然后它们将可用于所有子模块,但这似乎会产生名称错误。我的文件结构和代码如下:

目录

dir
 |
 +-- run_module.py
 |
 +--top_module
     |
     +--__init__.py
     |
     +--module.py
     |
     +--sub_module
         |
         +--__init__.py
         |
         +--sub_module_one.py
         |
         +--sub_module_two.py

run_module.py 的内容

from top_module import module

module.run_the_thing()

init .py的内容 目前,这两个__init__文件都是空的,但如果top_mod.__init__有导入而不是module,以及导入module和被导入,则此问题仍然存在run_module

module.py 的内容

from .sub_module import sub_module_one, sub_module_two

def run_the_thing():
    sub_module_one.hello()
    sub_module_two.greeting()

sub_module_one.py 的内容

def hello():
    print('I am sub-module 1.')

sub_module_two.py 的内容

def hello():
    print('I am sub-module 2.')

def callout():
    print('And this is my friend:')
    sub_module_one.hello()

def greeting():
    hello()
    callout()

运行时,它会sub_module_one按预期打印输出,并打印所有内容,sub_module_two直到调用sub_module_one.

我不能说我对这种行为感到惊讶,但是有没有一种解决方案可以让我在顶级脚本中导入所有子模块,让它们可供所有其他人使用,或者我必须在每个和每个子模块?

显然这对我的 MWE 来说并不算太乱,但真正的代码将是可怕的意大利面条。

标签: pythonimportmodule

解决方案


推荐阅读