是否可以将对象或值从Python脚本返回到托管应用程序?

时间:2009-07-06 09:23:41

标签: c# python ironpython

例如,在Lua中,您可以将以下行放在脚本的末尾:

return <some-value/object>

然后托管应用程序可以检索返回的值/对象。

我使用此模式,以便脚本可以代表事件处理程序的工厂。然后使用基于脚本的事件处理程序来扩展应用程序。例如,托管应用程序运行一个名为“SomeEventHandler.lua”的脚本,该脚本定义并返回一个对象,该对象是应用程序中“SomeEvent”的事件处理程序。

这可以在Python中完成吗?或者有更好的方法来实现这一目标吗?

更具体地说,我在我的C#应用​​程序中嵌入了IronPython,并且正在寻找一种方法来实例化这些基于脚本的事件处理程序,这将允许使用Python扩展应用程序。

4 个答案:

答案 0 :(得分:3)

这可以用Python完成同样的方式。您可以要求插件提供返回事件处理程序的getHandler()函数/方法:

class myPlugin(object):

  def doIt(self,event,*args):
    print "Doing important stuff"

  def getHandler(self,document):
    print "Initializing plugin"
    self._doc = document
    return doIt

当用户说“我想立即使用插件X”时,您知道要调用哪个函数。如果插件不仅要在直接命令之后调用,而且还要在某些事件(例如加载图形元素)之后调用,您还可以为插件作者提供将处理程序绑定到此事件的可能性。

答案 1 :(得分:2)

嵌入Python时完全有可能并且是一种常用技术。 This article显示了基础知识,this page也是如此。核心函数是PyObject_CallObject(),它调用C语言编写的代码。

答案 2 :(得分:2)

请参阅Embedding the Dynamic Language Runtime中的一些示例。

一个简单的例子,setting-and-fetching-variables

SourceCodeKind st = SourceCodeKind.Statements;
string source = "print 'Hello World'";
script = eng.CreateScriptSourceFromString(source, st);
scope = eng.CreateScope();
script.Execute(scope);
// The namespace holds the variables that the code creates in the process of executing it.
int value = 3;
scope.SetVariable("name", value);

script.Execute(scope);

int result = scope.GetVariable<int>("name");

答案 3 :(得分:1)

我这样做的方式(以及我看到它完成的方式)是为每个事件都有一个函数,所有事件都打包到一个模块中(或者几个,无关紧要),然后通过C调用函数/ C ++ / C#并使用其返回值。