如何动态导入文件夹中可变数量及名称的文件内函数并解决导入错误
问题解决与实现方案
错误原因
你写的from funcs import file是硬把file当成了字面量模块名,但Python不会把它识别为循环里的变量值(比如实际的quit),所以找不到对应模块才报错。
实现步骤与代码
第一步:把funcs转为Python包
在funcs文件夹里新建一个空的__init__.py文件,让Python识别这个文件夹为可导入的包。
第二步:修改main.py实现动态导入与函数调用
import os import importlib import inspect # 存储函数:键是函数名,值是函数对象 func_map = {} # 遍历funcs文件夹下的所有py文件 for file in os.listdir(r"funcs"): if file.endswith(".py") and not file.startswith("__"): # 排除__init__.py等特殊文件 module_name = file[:-3] # 动态导入模块 module = importlib.import_module(f"funcs.{module_name}") # 遍历模块成员,筛选出对外的函数 for name, member in inspect.getmembers(module): if inspect.isfunction(member) and not name.startswith("_"): # 跳过私有函数 func_map[name] = member # 实现输入调用逻辑 while True: user_input = input("请输入要调用的函数名(输入exit退出):").strip() if user_input == "exit": break if user_input in func_map: try: func_map[user_input]() except Exception as e: print(f"函数执行结果:{e}") else: print(f"不存在名为{user_input}的函数")
代码关键说明
- 用
importlib.import_module()实现动态导入,能把循环变量作为模块名的一部分,自动导入每个py文件对应的模块。 - 用
inspect模块筛选出模块里的函数,避免导入无关成员。 - 把函数存入
func_map字典,通过输入的函数名直接映射到对应函数,调用更便捷。 - 循环接收用户输入,处理函数执行的异常,同时支持退出指令,后续在
funcs里新增文件和函数时,无需修改main.py就能自动导入。
测试效果
输入quit时,会触发函数抛出的bye异常,程序打印函数执行结果:bye后回到输入提示;输入exit则直接退出程序。
内容的提问来源于stack exchange,提问作者Red Potato
相关产品推荐
相关产品推荐

