是否可以从Python脚本向宿主应用返回对象或值?

3 投票
4 回答
3084 浏览
提问于 2025-04-15 12:42

比如在Lua语言中,你可以在脚本的最后加上一行代码:

return <some-value/object>

这样返回的值或对象就可以被运行这个脚本的应用程序获取。

我使用这种方式是为了让脚本可以作为事件处理器的工厂。基于脚本的事件处理器可以用来扩展应用程序。举个例子,运行的应用程序会执行一个叫做'SomeEventHandler.lua'的脚本,这个脚本定义并返回一个对象,这个对象就是你应用程序中'SomeEvent'的事件处理器。

那么在Python中可以做到这一点吗?或者有没有更好的方法来实现这个功能?

更具体一点,我在我的C#应用程序中嵌入了IronPython,想找一种方法来实例化这些基于脚本的事件处理器,这样就可以用Python来扩展应用程序。

4 个回答

2

在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”时,你就知道该调用哪个函数。如果这个插件不仅仅是在用户直接命令后调用,还需要在某些事件发生时调用(比如加载一个图形元素时),你也可以给插件的作者提供一些方法,让他们把处理器绑定到这个特定的事件上。

2

可以在这个链接里看到一些例子:嵌入动态语言运行时

这里有一个简单的例子,关于设置和获取变量

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");
2

在嵌入Python时,这完全是可能的,而且是一种常见的技术。这篇文章介绍了基础知识,这页内容也是如此。核心功能是 PyObject_CallObject(),它可以从C语言中调用用Python写的代码。

撰写回答