Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run Lua script from Python

Tags:

python

lua

lupa

Suppose I have a Lua script that contains 2 functions. I would like to call each of these functions with some arguments from a Python script.

I have seen tutorials on how to embed Lua code in Python and vice versa using Lunatic Python, however, my Lua functions to be executed in the Python script are not static and subject to change.

Hence, I need some way of importing the functions from the .lua file or simply executing the .lua file from the Python script with some arguments and receive a return value.

Could someone point me in the right direction?

Would be much appreciated.

like image 543
user2253546 Avatar asked Jun 15 '15 09:06

user2253546


People also ask

Can Python run Lua?

The lua module interfaces Python code to the Lua library, thus allowing Lua scripts to be run from Python. For most operations, a lua. lua object must be created. This object does all the work.

How do I run a Lua script?

To run a Lua scriptOpen the Lua Script Library through Prepare > Run Lua Script. Use the appearing dialog to load, save, and execute Lua scripts as well as to create new ones. Select the script to be run. Click Execute Script.

Can Notepad ++ run Lua?

lua file and automatically runs it on Notepad++ startup. You can easily edit this file via Plugins > LuaScript > Edit Startup Script . You can include any commands you want to immediately execute on program startup, as well as register any additional shortcuts or callbacks.


1 Answers

You can use a subprocess to run your Lua script and provide the function with it's arguments.

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)
  • the -l requires the given library (your script)
  • the -e is the code that should be executed on start (your function)

The value of result will be the value of STDOUT, so just write your return value to it and you can simply read it in your Python script. The demo Lua script I used for the example simply prints the arguments:

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

function test2(a)
    print(a)
end

In this example both files have to be in the same folder and the lua executable must be on your PATH.


An other solution where only one Lua VM is spawned is using pexpect and run the VM in interactive mode.

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()

So you can use sendline(...) to send a command to the interpreter and readline() to read the output. The first child.readline() after the sendline() reads the line where the command will be print to STDOUT.

like image 85
tbraun89 Avatar answered Oct 06 '22 13:10

tbraun89