Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何加载目录中的所有模块并从模块中获取类_Python_Module - Fatal编程技术网

Python 如何加载目录中的所有模块并从模块中获取类

Python 如何加载目录中的所有模块并从模块中获取类,python,module,Python,Module,我使用Python2.7。 我需要加载目录中的所有模块。有些模块存储在目录中,有些存储在子目录中。 结构 dir | Tool1 | | | __init.pyc__ | tool1.pyc Tool2 | | | __init.pyc__ | tool2.pyc tool3.pyc tool4.pyc 每个工具都包含带有Run方法的类。我可以使用导入加载工具,然后查看dict.keys() 它看起来

我使用Python2.7。 我需要加载目录中的所有模块。有些模块存储在目录中,有些存储在子目录中。 结构

dir
   |
   Tool1
   |    |
   |   __init.pyc__
   |   tool1.pyc
   Tool2
   |    |
   |   __init.pyc__
   |   tool2.pyc
   tool3.pyc
   tool4.pyc
每个工具都包含带有Run方法的类。我可以使用导入加载工具,然后查看dict.keys() 它看起来像:

['__all__', '__builtins__', 'glob', '__file__', 'traceback', 'GlobalTool', 'run_me', '__package__', 'sys', '__path__', 'Tool1', 'time', '__name__', 'csv', 'os', '__doc__']
Tool1-是类名。 每个类都有属性版本。 如何从目录中加载所有模块并从中提取类,以及打印所有模块的版本属性

其他代码信息: 工具1.py:

import sys, os, csv
from time import time
import traceback
from core.global_tool import GlobalTool

class ParseFiXEDVALUES(GlobalTool):
    _tool_name = 'FIED_VALUES'
    _VERSION = '0.1'

    def run(self):
        """Main function"""
        start_time = time()
        cur = self.db.cursor()
        pass
MyLoad工具:

import os
import sys
mods_dir = '/home/test/multitool'
mods = {}
sys.path.append(mods_dir)

for module in os.listdir(mods_dir):
 if '.py' in module and '.pyc' not in module:
     current = module.replace('.py', '')
     modules[current] = __import__(current)

当前,它显示所有pyc或py文件,但需要目录和类例程,您需要做的就是检查
模块
是否是一个包含
\uuu init\uuuuupy.py
文件的目录:

import os
import sys
import importlib
import inspect
import logging

def load_module(module_path, filename):
    """ returns the module if filename is a module else None """
    if filename.endswith('.py'):
        module = filename[:-3]
    elif os.path.exists(os.path.join(module_path, filename, '__init__.py')):
        module = filename
    else:
        return None
    try:
        return importlib.import_module(module)
    except:
        logging.exception('Loading %s failed.' % module)
        return None

class PluginManager(object):
    def __init__(self):
        self.modules = {}
        self.classes = {}

    def add_path(self, module_path):
        sys.path.append(module_path)
        for filename in os.listdir(module_path):
            module = load_module(module_path, filename)
            if module:
                self.modules[module.__name__] = module
                self._extract_classes(module)
        sys.path.remove(module_path)

    def _extract_classes(self, module):
        for name in dir(module):
            obj = getattr(module, name)
            if inspect.isclass(obj):
                if hasattr(obj, '_VERSION'):
                    version = getattr(obj, '_VERSION')
                    logging.info("Found %s.%s %s" % (module.__name__, name, version))
                    self.classes[name] = obj

logging.getLogger().level = logging.INFO
plugins = PluginManager()
plugins.add_path('/home/test/multitool')

你能显示你的代码片段或试用代码吗?[link]我不想点击的链接是什么,你能在你的问题中发布吗。代码迭代所有模块,但不提取类。我添加了打印模块、模块路径、文件名。我还修改了一点加载模块。我添加了
code elif filename.endswith('.pyc'):module=filename[:-4]
来加载pyc。Load Function运行并返回所有pyc和py模块,但未提取类。还在想办法解决这个问题,真丢人。模块中存在不正确的版本拼写