2

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

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

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

PluginManager.pyで、次のクラスを定義しました。

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にはプラグインパスが含まれています。

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

from root.plugins.PluginManager import UI_Plugins

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

プラグインを読み込もうとすると、次のエラーが発生します。

No module named plugins.PluginManager 

どうすればこの問題を解決できますか?

4

3 に答える 3

5

申し訳ありませんが、これは確かにあなたの質問に対する直接の答えではありませんが、python3のyapsyに非常に近いものを開発しようとしている場合は、python3-をいくつかリリースした新しいバージョンのyapsyに興味があるかもしれません。互換性のあるパッケージ:

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

于 2011-12-23T01:10:02.133 に答える
2

インポートステートメント

from root.plugins.PluginManager import UI_Plugins

rootはパッケージではないため、機能しません。

ただし、アプリケーションがで開始された場合

python3 root/main.py

その場合、実際にはパッケージである必要rootはありません。

あなたがする必要があるのは、インポートステートメントをに変更することtextui.pyです

from plugins.PluginManager import UI_Plugins

そして、すべてが正しく機能するはずです。

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

于 2011-12-19T22:22:10.443 に答える
1
  1. __init__.pyパッケージを作成するには、ディレクトリにファイルを作成する必要があります。空の場合もありますが、「root」ディレクトリと「plugin」ディレクトリの両方に存在する必要があります。
  2. ディレクトリの名前は名前空間の名前であるため、慎重に一致させる必要があります。あなたの場合、あなたは使用する必要がありますfrom root.plugin.PluginManager import UI_Plugins
  3. 最後に、インポートを機能させるには、パッケージがPYTHONPATHに含まれている必要があります(言語ドキュメンテーションの「モジュール検索パス」を参照)。これを行うには、ディレクトリをPYTHONPATH環境変数に追加するか、コードでsys.pathリストに追加します。
于 2011-12-19T21:08:54.413 に答える