2011-12-19 15 views
2

yapsyに似たプラグインフレームワークを作成しようとしています(残念ながら、yapsyはpython3と互換性がありません)。Python3プラグインシステム

私のコードは次のようになります。

class PluginMetaclass(type): 
    def __init__(cls, name, base, attrs): 
     if not hasattr(cls, 'registered'): 
      cls.registered = [] 
     else: 
      cls.registered.append((name,cls)) 

class UI_Plugins(object): 
    __metaclass__ = PluginMetaclass 

    #...some code here.... 

    def load(): 
     #...some code here too... 

     if "__init__" in os.path.basename(candidate_filepath): 
      sys.path.append(plugin_info['path']) 
     try: 
      candidateMainFile = open(candidate_filepath+".py","r") 
      exec(candidateMainFile,candidate_globals) 
     except Exception as e: 
      logging.error("Unable to execute the code in plugin: %s" % candidate_filepath) 
      logging.error("\t The following problem occured: %s %s " % (os.linesep, e)) 
      if "__init__" in os.path.basename(candidate_filepath): 
       sys.path.remove(plugin_info['path']) 
      continue 

candidate_filepathは、プラグインのパスが含まれていますPluginManager.pyで

root 
    main.py 
    plugins/ 
     __init__.py 
     PluginManager.py 
     UI/ 
      __init__.py 
      textui.py 

私は以下のクラスを定義しました。

textui.pyには、次のものが含まれています

from root.plugins.PluginManager import UI_Plugins 

class TextBackend(UI_Plugins): 
    def run(self): 
     print("c") 

私はこのエラーを取得するプラグインをロードしようとすると:

No module named plugins.PluginManager 

どのように私はこの問題を解決することができますか?

答えて

2

rootはパッケージではありませんので、import文

from root.plugins.PluginManager import UI_Plugins 

は動作しません。

アプリケーションが

python3 root/main.py 

で開始された場合は、その後、rootは実際には、パッケージするを必要としません。

あなたがする必要があるのは

from plugins.PluginManager import UI_Plugins 

textui.pyでimport文を変更し、everthingが正常に動作するはずです。

この理由は、現在実行中のスクリプトのディレクトリが常にsys.pathの先頭に自動的に追加されるためです。あなたの場合、これはrootであり、pluginsはそのディレクトリ内のパッケージであるため、アプリケーション内のどこからでも直接インポートできます。したがって、あなたのmainスクリプトがどこに残っている限り、他のパス操作は必要ありません。

1
  1. パッケージを使用するには、ディレクトリに__init__.pyファイルが必要です。これは空でもかまいませんが、 "root"と "plugin"の両方のディレクトリになければなりません。
  2. ディレクトリの名前は名前空間の名前なので、慎重に一致させる必要があります。あなたの場合、使用する必要がありますfrom root.plugin.PluginManager import UI_Plugins
  3. 最後に、インポートを機能させるには、パッケージがPYTHONPATHになければなりません(言語ドキュメントのThe Module Search Pathを参照)。これを行うには、PYTHONPATH環境変数にコードを追加するか、sys.pathリストにそのディレクトリを追加します。
+0

大変申し訳ありません。私が間違えました!申し訳ありませんが、元の投稿を修正しました。 – Pie86

+0

OK、返信も更新しました。 –

5

申し訳ありませんが、これは確かあなたの質問に直接答えはありませんが、あなたがpython3のyapsyに非常に近いものを開発しようとしているなら、私はyapsyの新しいバージョンpython3互換パッケージのカップル:

https://sourceforge.net/projects/yapsy/files/Yapsy-1.9/

(Yapsy-1.9_python3-py3.2.eggまたはYapsy-1.9-python3.tar.gz参照)

特定の上にあるソースコード支店:

http://yapsy.hg.sourceforge.net/hgweb/yapsy/yapsy/file/91ea058181ee

関連する問題