Python和lua互相调用

本帖中用到的py模块是lupa,目前版本是1.7,通过pip可以直接安装。说明一下,由于这个模块的文档非常少,只有几个代码例子,所以以下所说都是根据已有的例子自己测出来的。如果有更好的办法请回帖。

一、python调用lua,照搬lupa在python社区的所有例子都可以,但要注意一点,整段的lua文件代码,不能使用eval方法,一定会报错。原因不多讲了。整段lua代码的调用直接execute()

二、lua调用python,这就是亮点,也是一个容易踩的坑。首先你不能在lua代码里直接使用py的任何变量,如果要使用,需要通过eval来执行一个匿名定义,然后通过eval返回值(他是py的一个function)来当做py本地函数来调用。

下文是例子:

import lupa
from lupa import LuaRuntime
lua = LuaRuntime(unpack_returned_tuples=True)

def py_func(p):
    print p
    return 'hello '+str(p)

#execute无返回,打印出来是None
lua.execute('var_before=1;print(var_before);')

#eval返回的是一个lua call到py call的映射
pycall = lua.eval('function(pyfunc,param1) var_before=pyfunc(param1) end')

pycall(py_func,'world')

lua.execute('print(var_before)')

通过以上例子应该能看明白二者互相调用的方式。重要的事情多说几遍,eval内部只能是匿名过程。所以要互相调用,目前我所知道的办法就是频繁的切换eval和execute来控制lua执行

以上执行过程都是在lua这个luaruntime实例里运行的,所以属于一个上下文,这点极其重要,直接关乎到性能问题,同时共享上下文变量的值得以继承,真正实现了无缝切换,多实例的lua vm没有测试过,理论上是不影响的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注