Python 导入一个文件夹中的所有模块,并按其属性之一使用它们

Python 导入一个文件夹中的所有模块,并按其属性之一使用它们,python,import,Python,Import,我正在尝试构建一个可模块化的应用程序,因此我需要一种方法,允许我在不修改主应用程序的情况下创建新模块。为此,我准备了一个模块系统,它允许我从一个文件夹中导入所有模块,我想通过使用class属性来选择要使用的模块 模块包括: 拓扑图_O.py: 拓扑结构_H.py: 我想这样使用它们: myTopology = some_topology_thing('O') print myTopology # Topology: O # > Version: 0.1 myTopology = so

我正在尝试构建一个可模块化的应用程序,因此我需要一种方法,允许我在不修改主应用程序的情况下创建新模块。为此,我准备了一个模块系统,它允许我从一个文件夹中导入所有模块,我想通过使用class属性来选择要使用的模块

模块包括:

拓扑图_O.py:

拓扑结构_H.py:

我想这样使用它们:

myTopology = some_topology_thing('O')
print  myTopology
# Topology: O
#  > Version: 0.1

myTopology = some_topology_thing('H')
print  myTopology
# Topology: H
#  > Version: 0.1
因此,将按名称选择和使用模块。

可在此处提供帮助:

import importlib

def some_topology_thing(topo_type):
    mod = importlib.import_module('topology_{}'.format(topo_type))
    return mod.Topology()
您可以在此提供帮助:

import importlib

def some_topology_thing(topo_type):
    mod = importlib.import_module('topology_{}'.format(topo_type))
    return mod.Topology()
我自己的解决办法

import os
import imp
from glob import glob

def some_topology_thing(topology):
    topologys = {}

    module_path = os.path.join(os.path.dirname(__file__), '..', 'topologys')
    modules = glob(module_path + '/*.py')

    for i in modules:
        foo = imp.load_source('', i)
        topologys.update({foo.Topology().name: i})

    try:
        return imp.load_source('', topologys[topology]).Topology()
    except ImportError:
        print "Error: no topology \'" + topology + "\' Found"
        print "Available topologys are: " + str(topologys.keys())
我自己的解决办法

import os
import imp
from glob import glob

def some_topology_thing(topology):
    topologys = {}

    module_path = os.path.join(os.path.dirname(__file__), '..', 'topologys')
    modules = glob(module_path + '/*.py')

    for i in modules:
        foo = imp.load_source('', i)
        topologys.update({foo.Topology().name: i})

    try:
        return imp.load_source('', topologys[topology]).Topology()
    except ImportError:
        print "Error: no topology \'" + topology + "\' Found"
        print "Available topologys are: " + str(topologys.keys())

我想您也希望根据name属性导入所需的模块?…就像某些\u topology\u thing'O'->自动导入拓扑\u O…?@IronFist是的,这就是我需要的,然后我相信Mike Müller的模块将与我发布的相同..:我想您也希望根据name属性导入所需的模块?…就像某些\u topology\u thing'O'->自动导入拓扑\u O…?@IronFist是的,这就是我需要的,然后我相信Mike Müller的模块将与我发布的相同..:如果你有点耐心的话…我会用同样的方式回答…:/。。。“太坏了”看起来比你提出同样的解决方案更像样;是的……因为这件事发生了,我几个月前读到了有关importlib模块的文章,当时我正在试图了解导入机制……以及其他导入方式……无论如何……我认为这应该是OP的正确方式……我使用imp模块找到了我自己的解决方案,但您的解决方案更简单、优雅、更快;,非常感谢IMP的文档:在大多数情况下,你最好考虑使用UnimLIB模块的功能,如果你只是有点耐心……我会以同样的方式回答……“太坏了”看起来比你提出同样的解决方案更像样;是的……因为这件事发生了,我几个月前读到了有关importlib模块的文章,当时我正在试图了解导入机制……以及其他导入方式……无论如何……我认为这应该是OP的正确方式……我使用imp模块找到了我自己的解决方案,但您的解决方案更简单、优雅、更快;,非常感谢IMP的文档:在大多数情况下,你最好考虑在这个模块上使用IppILB模块的功能。捕获每一个异常并不是非常有利的,我认为你最好捕捉异常,你只想它会提高它,以便于调试。as:exception ImportError:捕获每个异常并不是真正有利的,我认为您最好捕获仅认为会引发异常的异常,以便于调试,as:exception ImportError: