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
相关产品推荐
相关产品推荐

