2

py2exe で実行可能ファイルにエクスポートされるアプリケーションを python で作成しています。アプリケーションがexeの場合に機能するプラグインシステムを作成しようとしています。

私の元のコードは次のようになりました

import os
Plugins=os.listdir('plugins')
for P in Plugins:
    PItems=os.path.splitext(P)
    PName=PItems[0]
    if PItems[len(PItems)-1]=='.py':
        Mod=__import__('plugins.'+PName,fromlist=['*'])
        Mod.init()

しかし、exe にエクスポートすると、インポートしようとしたときにモジュール 'plugins.(pluginName)' が見つかりません。

プラグインは、アプリケーション API にアクセスするために import my_application も実行できる必要があります。

mcEdit (python で書かれている) とSublime Text (わからない) はこれを行うことができますが、ソース コードを調べても方法がわかりません。

exeにエクスポートしたときに機能するものを書くにはどうすればよいですか?

編集: 明確にするために

  • プラグインは、アプリケーションのロード時に自動的にロードされる必要があります。それらはplugins/ディレクトリに保存されます
  • import myapplicationプラグインは、またはなどのAPI 呼び出しを実行して、アプリケーションと対話できる必要がありますmyapplication.getFoo()myapplication.setBar(Bar)
  • これらのプラグインは、1 回だけ実行することも、マウスのクリックや移動などのイベントで実行することも、画面が描画されるたびに実行することもできます。アプリケーションの実行中は、状態 (変数値、オブジェクトなど) を保持したいと思います。
4

1 に答える 1

0

Ok。答えがあると思います。

ファイル構造は次のようになります。

api/
  - __init__.py
  - etc...
plugins/
  - plugin.py
  - etc...
- MainScript.py
- PyExeCreator.py

MainScript.py は次のようになります。

import os,sys, api

RootDir=os.getcwd() 
#Add this directory to export
if RootDir not in sys.path:
    sys.path.append(RootDir)

#Plugin stuff
def LoadPlugins():
    PluginsDir=os.path.join(RootDir,'plugins')
    Plugins=os.listdir(PluginsDir)

    Modules=[]
    for P in Plugins:
        PItems=os.path.splitext(P)
        PName=PItems[0]
        if PName!='__init__' and PItems[len(PItems)-1]=='.py':
            print "Loading plugins."+PName
            Mod=__import__("plugins."+PName,fromlist=['*'])
            Modules.append(Mod)
    return Modules
def RunPlugins(Modules):
    for Plugin in Modules:
        Plugin.Run()

Plugins=LoadPlugins()

#Just checking plugins can modify variables.
api.Run()
RunPlugins(Plugins)
api.Run()

api/__init__.py は次のようになります。

MOTD="HI"
def Run():
    global MOTD
    print "API MOTD: "+MOTD

おそらく、よりエキサイティングな API になるでしょう。plugins/plugin.py

import api
def Run():
    api.MOTD="HELLO WORLD!"
    print "This is a plugin running!"

そして重要なのは、コンパイラ PyExeCreator.py

from distutils.core import setup
import py2exe

setup(
    name='Tester',
    console=['Loader.py'],
    packages=['api']
)

私が見逃していた重要な部分は、API をpackagesforに含めdistutils、現在のディレクトリの検索ディレクトリを設定することでした ( sys.path.append(os.getcwd()))

于 2013-08-01T08:11:56.073 に答える