2016-04-14 40 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

相關問題