2016-04-14 97 views
1

我试图构建一个可调整的应用程序,所以我需要一种方法,允许我在不修改主应用程序的情况下创建新模块。为此,我正在准备模块系统,该模块系统允许我从文件夹中导入所有模块,并且我希望通过使用类属性来选择要使用的模块。将所有模块导入到一个文件夹中,并通过它的一个属性使用它们

模块:

topology_O.py

class Topology(object): 
    def __init__(self): 
     self.name = 'O' 
     self.version = 0.1 

    def __str__(self): 
     string = "Topology: " + self.name 
     string += "Version: " + str(self.version) 
     return string 

topology_H.py

class Topology(object): 
    def __init__(self): 
     self.name = 'H' 
     self.version = 0.1 

    def __str__(self): 
     string = "Topology: " + self.name 
     string += "\n > Version: " + str(self.version) 
     return string 

我想使用它们像这样:

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

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

于是冒顿les将被name选中和使用。

+1

我想你也希望根据导入时需提供模块,以及在'name'属性...只是像'some_topology_thing('O')' - >自动导入topology_O ...? –

+0

@IronFist是的,这就是我需要的 – efirvida

+1

然后我相信迈克米勒的一个将是我将发布.. :) –

回答

4

importlib可以帮助在这里:

import importlib 

def some_topology_thing(topo_type): 
    mod = importlib.import_module('topology_{}'.format(topo_type)) 
    return mod.Topology() 
+0

如果你只是有点耐心......我会以同样的方式回答......:/ ...太差 –

+0

看起来像一个体面的答案,而不是你提出了相同的解决方案。 ;) –

+0

是的...因为它发生了几个月前我读了'importlib'模块,因为我试图理解导入机制......还有什么其他方式导入......无论如何......这应该是正确的方式为OP在我的愚见... –

1

自己的解决方案

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()) 
+1

捕捉每个异常并不是真的有利,我认为你最好捕捉这个异常,你只会认为它会提升它,以便于调试,例如:'except ImportError:' –

+0

感谢提示@IronFist – efirvida

相关问题