从Python运行Lua脚本

5
假设我有一个包含2个函数的Lua脚本。 我想从Python脚本中使用一些参数调用这些函数。
我看过使用Lunatic Python嵌入Lua代码和反之亦然的教程,但是我要在Python脚本中执行的Lua函数不是静态的,而是可能会改变。
因此,我需要一种方法来从.lua文件中导入函数或仅仅执行.lua文件并传入一些参数,在Python脚本中接收返回值。
请问有人能指点我正确的方向吗?
非常感谢。
1个回答

7

您可以使用subprocess来运行Lua脚本并向函数提供其参数。

import subprocess

result = subprocess.check_output(['lua', '-l', 'demo', '-e', 'test("a", "b")'])
print(result)

result = subprocess.check_output(['lua', '-l', 'demo', '-e', 'test2("a")'])
print(result)
  • -l参数需要给定的库(您的脚本)。
  • -e参数是在启动时应该执行的代码(您的函数)。

结果的值将是STDOUT的值,因此只需将返回值写入即可,在Python脚本中简单读取它。我用于示例的演示Lua脚本仅打印参数:

function test (a, b)
    print(a .. ', ' .. b)
end

function test2(a)
    print(a)
end

在这个例子中,两个文件都必须在同一个文件夹中,并且 lua 可执行文件必须在您的 PATH 中。
另一种只生成一个 Lua VM 的解决方案是使用 pexpect 并在交互模式下运行 VM。
import pexpect

child = pexpect.spawn('lua -i -l demo')
child.readline()

child.sendline('test("a", "b")')
child.readline()
print(child.readline())

child.sendline('test2("c")')
child.readline()
print(child.readline())

child.close()

你可以使用sendline(...)向解释器发送命令,使用readline()读取输出。在sendline()之后,第一个child.readline()将读取命令被打印到STDOUT的那一行。


1
每次都创建一个新的Lua VM,那么只创建一次Lua VM呢? - Egor Skriptunoff
我想将调用Lua函数的结果设置为变量,而不需要解析。这有可能吗? - user2253546
2
对于那些想要从Python传递数组和其他数据结构到Lua的人来说,这个链接非常有用:https://dev59.com/nIHba4cB1Zd3GeqPRXbg - user2253546

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接