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 : wangxiaofeng01@corp.netease.com
# @desc: : 拿到一个文件夹下所有文件中的所有类
# 结合protobuff的序列化,就可以比较完美的解决网络消息传递的问题了
# 至少能做一个看起来至少格式还不错的rpc
import os
import imp
import inspect
def get_all_class_from_modules(modules_list):
"""可以用inspect直接根据module拿到其中所有的类 wangxiaofeng01@corp.netease.com
: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 wangxiaofeng01@corp.netease.com
: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):
"""../代表上层路径开始,直接写相当于当前路径开始 wangxiaofeng01@corp.netease.com
用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]