您现在的位置是:网站首页 > 博客日记 >

python动态导入文件夹下所有模块

作者:YXN-python 阅读量:63 发布日期:2025-05-19

如下:

导入当前文件夹下所有脚本,脚本的name属性作为键,对象作为值返回

# auto_script/__init__.py
import importlib
import inspect
import os
from typing import Type, Dict


def import_all_script() -> Dict[str, Type]:
    """
    导入当前目录下的py pyc文件所有类
    键是“类的name属性”,值是对应的类对象。
    """
    current_dir = os.path.dirname(os.path.abspath(__file__))
    classes = {}
    package_name = __name__
    filter_list = ['template.py']  # Exclusion

    for filename in os.listdir(current_dir):
        if filename.endswith(('.py', '.pyc')) and not filename.startswith('_') and filename not in filter_list:
            module_name = os.path.splitext(filename)[0]
            try:
                if package_name == "__main__":
                    full_module_name = f"auto_script.{module_name}"
                else:
                    full_module_name = f".{module_name}"

                module = importlib.import_module(full_module_name, package=package_name)

                for name, obj in inspect.getmembers(module):
                    expected_module = f"{package_name}.{module_name}" if package_name != "__main__" else f"auto_script.{module_name}"
                    if inspect.isclass(obj) and obj.__module__ == expected_module:
                        full_name = obj.name  # name作为键
                        classes[full_name] = obj

            except ImportError as e:
                print(f"无法导入模块:{module_name}: {e}")
            except Exception as e:
                print(f"导入模块错误: {module_name}: {e}")

    return classes

脚本应该要定义name属性

class Task1:
    name = '脚本1'

class Task2:
    name = '脚本2'

YXN-python

2025-05-19