You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何通过变量名动态调用指定模块下的对应函数

方案1:修改commands包的__init__.py,实现直接通过commands.模块名访问

你原有__init__.py里只定义了__all__但没有实际将子模块绑定到包的命名空间,需要补充导入逻辑:

from os.path import dirname, basename, isfile, join
import glob
import importlib

modules = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')]

# 新增逻辑:将所有子模块绑定到commands包属性
for mod_name in __all__:
    # 相对导入当前包下的子模块
    mod = importlib.import_module(f'.{mod_name}', package=__name__)
    globals()[mod_name] = mod

然后main.py中不要使用from commands import *,直接导入commands包即可:

import commands

# 示例:从用户输入/配置中获取要调用的模块名
input_mod = "a"

if input_mod in commands.__all__:
    # 动态获取模块对象,调用foo方法
    x = getattr(commands, input_mod).foo()
    print(x) # 输出 bar
else:
    print(f"非法模块名,可选值:{commands.__all__}")

方案2:无需修改__init__.py,直接在业务代码中动态导入

如果你不想改动原有的包配置,可以直接在main.py中用importlib动态导入指定子模块:

import importlib

input_mod = "b"
try:
    # 按路径导入子模块
    target_mod = importlib.import_module(f"commands.{input_mod}")
    x = target_mod.foo()
    print(x) # 输出 bar
except ModuleNotFoundError:
    print(f"不存在的模块:{input_mod}")

内容的提问来源于stack exchange,提问作者Tape Dispenser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:30:03