python递归拿到包里面所有的文件,文件里面所有的类名,以及类本身

1、递归拿到一个文件夹(python包)中所有的py文件路径

使用os.walk(dir),可以递归拿到所有的文件夹,文件夹下所有的文件
代码如下:

import os
# root就是你输入的目录,作为根目录
# dirs就是当前目录下的目录列表
# files就是当前遍历的目录下所有的文件
for root, dirs, files in os.walk('yourTargerFolderPath'):
    for file in files:
    	# 如果是py文件并且不是包的__init__.py
        if file.endswith(".py") and file != '__init__.py':
            print root, file

2、根据文件的路径生成这个文件的module

使用imp.load_source('',py_path)将文件的全路径生成该文件的module

import imp
for path in modules_path_list:
	# 斜杠或是反斜杠都行,不要求
    module = imp.load_source('', 'C:\Users\wangxiaofeng01\Desktop\test.py')
    print module

3、根据module拿到其中的所有类名以及类

使用inspect.getmembers(module, filter_method)拿到module中所有的东西

import inspect
for module in modules_list:
    for name, obj in inspect.getmembers(module):
        if inspect.isclass(obj):
            class_list[name] = obj

他有很多重载方法,比如:上面的还可以写成

for name, obj in inspect.getmembers(module, inspect.isclass):
        class_list[name] = obj

还有其他的inspect.ismethod()等等

4、有什么用呢?

所以上面这3个有什么用呢?很有用,递归拿到一个文件夹中所有的类名和对应的类,能做的事情太多了,觉得很牛逼或者还不错,下方点赞

这里提供一个整合的方案

# -*- coding: utf-8 -*- 
# @Time     : 2020/8/13 17:10 
# @Author   : [email protected]
# @desc:    : 拿到一个文件夹下所有文件中的所有类
# 结合protobuff的序列化,就可以比较完美的解决网络消息传递的问题了
# 至少能做一个看起来至少格式还不错的rpc


import os
import imp
import inspect


def get_all_class_from_modules(modules_list):
    """可以用inspect直接根据module拿到其中所有的类 [email protected]

    :param modules_list:
    :return:
    """
    class_list = {}
    for module in modules_list:
        for name, obj in inspect.getmembers(module, inspect.isclass):
                class_list[name] = obj
    return class_list



def get_all_modules(modules_path_list):
    """ 根据文件的路径,可以通过imp直接引入这个文件module [email protected]

    :param modules_path_list:
    :return:
    """
    all_modules = []
    for path in modules_path_list:
        module = imp.load_source('', path)
        all_modules.append(module)
    return all_modules


def get_all_modules_path(dir):
    """../代表上层路径开始,直接写相当于当前路径开始 [email protected]
    用os.walk可以递归找到所有的文件

    :param dir: the modules you need dir
    :return: list[modules]
    """
    all_modules_path = []
    # root就是你输入的目录,作为根目录
    # dirs就是当前目录下的目录列表
    # files就是当前遍历的目录下所有的文件
    for root, dirs, files in os.walk(dir):
        for file in files:
            if file.endswith(".py") and file != '__init__.py':
                all_modules_path.append(root + '/' + file)
    return all_modules_path


class_dict = get_all_class_from_modules(get_all_modules(get_all_modules_path('../Serialize/TestModule')))
for item in class_dict.iteritems():
    print item[0], item[1]


你可能感兴趣的:(python进阶,序列化,设计模式)