2011-08-06 3 views
1

플러그인과 같은 모듈에서 메소드를 가져 오는 클래스를 만들려고합니다.파이썬; 메소드를 'pluginstyle'클래스로 가져 오는 방법은 무엇입니까?

내가이 클래스에 대해 원하는 것은 별도의 폴더에 저장된 모듈 (예 : '플러그인')에서 함수/변수를 가져올 수 있다는 것입니다. 이것이 가능한가?

나는 약 __import__()을 알고 있지만 가져 오기에는 어떻게 사용하여이 클래스에 속할 수 있습니까?

내가 '플러그인'폴더에 다음과 같은 모듈을 가지고 있다고 할 수 있습니다 : 나는 등 기능을 가지고 이러한 모듈에서

plugins/pluginA.py 
plugins/pluginB.py 

그리고 내가 가져 와서 클래스에 액세스 할 수 있어야합니다. 아마 뭔가 같은 :

MyClass.pluginA.some_function_from_A() 
MyClass.pluginB.some_function_from_B() 

또는 아마도이

MyClass.some_function_fromA() 
MyClass.some_function_fromB() 

답변

1
나는 두 부분으로 문제를 휴식 것이

같은 : 모듈의 목록에 파일의 목록을 돌려 다음 기능을 포함하는 클래스를 확장 그 모듈들로부터.

브렛 캐논은 how to import a module from just a file path에 해당하므로 여기에 복사하지 않을 것입니다 ... glob 모듈을 확인해 보도록하겠습니다.

둘째, 플러그인에서 함수를 포함하도록 클래스를 확장하는 방법입니다. 나는이 같은 것을 사용하는 것이 :

def extend(obj, plugin_modules): 
    for module in plugin_modules: 
     for export_name in dir(module): 
      export = getattr(module, export_name) 
      if callable(export): 
       setattr(obj, export_name, export) 


class MyClass(object): 
    … code … 

extend(MyClass, plugin_modules) 

을 그러나, 나는 그것이 가능성 있다고 경고합니다 이것은 정확히 네이티브 메소드처럼 행동하지 않습니다 MyClass에 기능을 "플러그인"당신이 ... 만약, 원하는 것을 당신이하려는 일에 대해 더 많은 정보를 주면 더 유용한 대답을 줄 수있을 것입니다.

+0

내가'getattr'와'setattr' 좋은 단서가 될 수 있다고 생각 ... 수입에 self을 전달하는 방법을 파악하는 것입니다. 감사! – Kanonskall

+0

그 두 가지를 사용하여 나는 대답을 찾은 것 같아요, 나는 그것을 아래에 게시했습니다. 다시 한번 감사드립니다. – Kanonskall

0

내가 실험과 구글에 뒤져 내가 제시 Noller에 의해 setattrgetatt 데이비드 Wolever에서와 This page에 대한 팁 덕분에 일할 수있는 솔루션을 마련했습니다 왔습니다.

여기까지 내가 지금까지 가지고있는 것이고 작동하고있는 것처럼 보입니다. 정리가 필요하고 미세 조정이 필요합니다.

class MyClass(object): 
    def __init__(self): 
     pass 

    def import_plugins(self): 

     plugins_to_import = [] 
     attribs_to_exclude = ['__builtins__', '__doc__', '__file__', '__name__', '__package__'] 
     plugins = [] 
     plugins_dir = './plugins' 

     # add the plugins directory to path 
     if os.path.isdir(plugins_dir): 
      sys.path.append(plugins_dir) 
     else: 
      print '%s is not a directory!' % (plugins_dir) 

     # make a list of the plugins to import 
     for plugin_file in os.listdir(os.path.abspath(plugins_dir)): 
      #print plugin_file 
      plugin_file_name, plugin_file_extension = os.path.splitext(plugin_file) 
      if plugin_file_extension == '.py': 
       plugins_to_import.append(plugin_file_name) 

     # import the plugins to a list 
     for plugin in plugins_to_import: 
      plugins.append(__import__(plugin)) 

     # add the attributes to self 
     for plugin in plugins: 
      for attribute in dir(plugin): 
       if attribute not in attribs_to_exclude: 
        self.__setattr__(attribute, getattr(plugin, attribute)) 

하나의 문제는 이제

관련 문제