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 回答