Python3.10:如何通过脚本导入模块子模块所有函数到指定命名空间
问题与解决方案
问题背景
模块文件夹结构:
allFunctions ├─ import_all.py ├─ __init__.py ├─ funcSetA │ ├─ __init__.py │ └─ funcA1.py │ └─ funcA2.py └─ funcSetB ├─ __init__.py ├─ funcB1.py ├─ funcB2.py └─ funcB3.py
核心需求:
- 导入后支持直接
funcA1()调用,或allFunctions.funcA1()调用 - 禁止使用
allFunctions.funcSetA.funcA1()这类嵌套路径调用 - 必须通过
import_all.py实现导入逻辑,不得修改顶层__init__.py,子模块的__init__.py可按需修改 - 无需考虑函数名冲突问题
此前尝试的代码无法运行:
import allFunctions from allFunctions import funcSetA as funcSetA from funcSetA import funcA1
使用Python 3.10版本。
方案1:实现直接funcA1()调用
在import_all.py中直接将所有子模块的函数导入到当前脚本的全局命名空间,后续导入import_all即可直接调用函数。
编写import_all.py
# 逐个导入函数(适合模块数量少的场景) from allFunctions.funcSetA.funcA1 import funcA1 from allFunctions.funcSetA.funcA2 import funcA2 from allFunctions.funcSetB.funcB1 import funcB1 from allFunctions.funcSetB.funcB2 import funcB2 from allFunctions.funcSetB.funcB3 import funcB3 # 批量导入(适合模块数量多的场景,自动遍历子模块) # import os # import importlib # # current_dir = os.path.dirname(__file__) # for sub_dir in ['funcSetA', 'funcSetB']: # sub_module_path = os.path.join(current_dir, sub_dir) # for file_name in os.listdir(sub_module_path): # if file_name.endswith('.py') and file_name != '__init__.py': # # 构建完整模块名 # module_name = f'allFunctions.{sub_dir}.{file_name[:-3]}' # module = importlib.import_module(module_name) # # 将模块中的非私有函数导入当前命名空间 # for attr_name in dir(module): # if not attr_name.startswith('_'): # globals()[attr_name] = getattr(module, attr_name)
使用方式
在项目根目录执行:
import import_all import_all.funcA1() # 交互环境中可通过`from import_all import *`实现直接`funcA1()`调用
方案2:实现allFunctions.funcA1()调用
借助子模块的__init__.py将函数提升到子模块层级,再通过import_all.py把函数挂载到allFunctions模块的命名空间,最后移除子模块的引用以禁止嵌套调用。
步骤1:修改子模块__init__.py
funcSetA/__init__.py:
from .funcA1 import funcA1 from .funcA2 import funcA2
funcSetB/__init__.py:
from .funcB1 import funcB1 from .funcB2 import funcB2 from .funcB3 import funcB3
步骤2:编写import_all.py
import allFunctions from allFunctions.funcSetA import funcA1, funcA2 from allFunctions.funcSetB import funcB1, funcB2, funcB3 # 将函数挂载到allFunctions模块的命名空间 allFunctions.funcA1 = funcA1 allFunctions.funcA2 = funcA2 allFunctions.funcB1 = funcB1 allFunctions.funcB2 = funcB2 allFunctions.funcB3 = funcB3 # 删除子模块引用,彻底禁止allFunctions.funcSetA.funcA1()这类调用 del allFunctions.funcSetA del allFunctions.funcSetB
使用方式
在项目根目录执行:
import import_all allFunctions.funcA1()
原代码失败原因
from funcSetA import funcA1路径错误:funcSetA并非import_all.py的同级模块,需使用完整导入路径from allFunctions.funcSetA import funcA1- 未完成函数到目标命名空间的挂载逻辑,无法实现预期的调用方式
内容的提问来源于stack exchange,提问作者Mauvai
相关产品推荐
相关产品推荐

