Ejecutar script Lua desde Python

Supongamos que tengo un script Lua que contiene 2 funciones. Me gustaría llamar a cada una de estas funciones con algunos argumentos de un script de Python.

He visto tutoriales sobre cómo incrustar código Lua en Python y viceversa usando Lunatic Python, sin embargo, mis funciones Lua para ser ejecutadas en el script de Python no son estáticas y están sujetas a cambios.

Por lo tanto, necesito alguna forma de importar las funciones del archivo .lua o simplemente ejecutar el archivo .lua desde el script de Python con algunos argumentos y recibir un valor de retorno.

¿Podría alguien apuntarme en la dirección correcta?

Sería muy apreciado.

Puede usar un subprocess para ejecutar su script Lua y proporcionar la función con sus argumentos.

 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) 
  • el -l requiere la biblioteca dada (su script)
  • el -e es el código que debe ejecutarse en el inicio (su función)

El valor del resultado será el valor de STDOUT , así que simplemente escriba su valor de retorno y simplemente puede leerlo en su script de Python. El script de demostración de Lua que utilicé para el ejemplo simplemente imprime los argumentos:

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

En este ejemplo, ambos archivos deben estar en la misma carpeta y el ejecutable lua debe estar en su PATH .


Otra solución en la que solo se genera una máquina virtual de Lua es usar pexpect y ejecutar la máquina virtual en modo interactivo.

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

Así que puede usar sendline(...) para enviar un comando al intérprete y readline() para leer la salida. El primer child.readline() después de sendline() lee la línea en la que se imprimirá el comando a STDOUT .