2
  • 私の主なアプリケーションはObjective-C/Cocoa(OS X)です
  • メインアプリケーションは、Python「プラグイン」を使用して「拡張」されます
  • Pythonフレームワークを利用しています

これは、特定のスクリプトを実行するための「ブリッジ」として使用しているコードです。

from Foundation import *
from AppKit import *

import imp
import sys

class ppPluginBridge(NSObject):
    @classmethod
    def loadModuleAtPath_functionName_arguments_documents_(self, path, func, args,docs):

        f = open(path)
        try:
             mod = imp.load_module('plugin', f, path, (".py", "r", imp.PY_SOURCE))
             realfunc = getattr(mod, func, None)
             if realfunc is not None:
                 realfunc(*tuple(args))
        except Exception as e:
             docs.showConsoleError_('%s' % e)
        finally:
             f.close()
             return NO

        return YES

したがって、この関数はスクリプトを取り込んでpathロード/実行します。

さて、私が必要としているのは、いくつかのpythonクラス/関数/モジュールを最終的なスクリプトで自動的に利用できるようにすることです(外部で宣言するか、できればppPluginBridge.pyファイルで宣言します)。

どうすればそれができますか?

4

1 に答える 1

1

まず、次のようなものをロードします。

>>> class Thingus:
...     def __init__(self):
...         module = __import__('string')
...         setattr(self,module.__name__,module)
... 
>>> thing = thingus()
>>> thing.string
<module 'string' from '/usr/lib/python2.7/string.pyc'>
>>> 

これは組み込みのインポート関数を使用してインポートthis.thatし、Pythonファイルへの直接パスではなく、標準のモジュール名を取得できることに注意してください。これはよりきれいです。モジュールが適切なモジュールであり、パス内にあることを確認する必要があります。

インポートしたいものを指定する場合は、ppPluginBridge.py内のリストを使用してみませんか?あなたはただ次のようなことをするでしょう:

plugin_modules = [ 'plugins.loader', 'plugins.serializer' ]

...またはあなたは何を持っていますか。Pythonは非常に表現力に富んでいるため、Pythonモジュール自体を構成ファイルにすることに問題はありません。もちろん、構成ファイルは適切に分離し、デフォルトが確立された後はバージョン管理システムによって無視され、個々のインストールで変更できるようにする必要があります。

于 2013-03-06T22:11:55.457 に答える