使用Python运行lua脚本前,需要先安装LuaJIT,LuaJIT的官网是下载 (luajit.org)
目前已不再使用.exe文件的下载方式,需要使用Git从公共仓库下载源码,git命令为:
$ git clone https://luajit.org/git/luajit.git
下载后源码文件夹会保存到git设置的路径下 ,随后再打开官网的安装教学界面安装 (luajit.org)
根据官网提示,Windows平台需要使用Visual Studio、MinGW 或 Cygwin 程序构建,我用的Visual Studio。打开Visual Studio后跳过建立项目界面 ,打开开发者命令提示。
随使用命令cd到下载后luajit文件夹的src路径
cd C:\......(自己的下载路径)\luajit\src
随后输入命令构建程序
mingw32-make
完成后,src文件夹会多出luajit.exe文件和lua51.dll,随便一个顺眼的地方新建一个LuaJIT文件夹,将luajit.exe文件和lua51.dll复制进去,再新建一个lua文件夹,把jit文件夹复制进去
把LuaJIT文件夹的路径添加到环境变量的系统变量path中
添加完成后按win+r打开,输入cmd,在cmd中输入:
luajit
LuaJIT安装完成。
开始编写一个lua脚本,我从《lua程序设计》这本书中挑选了一个很经典的八皇后问题的代码抄上去,编写完成后运行一下检查是否存编译问题并保存为.lua文件:
N = 8function isplaceok(a, n, c)for i = 1, n - 1 doif (a[i] == c) or(a[i] - i == c - n) or(a[i] + i == c + n) thenreturn falseendendreturn true
endfunction printsolution(a)for i = 1, N dofor j = 1, N doio.write(a[i] == j and "X" or "-", " ")endio.write("\n")endio.write("\n")
endfunction AoLiGei(a, n)if n > N thenprintsolution(a)elsefor c = 1, N doif isplaceok(a, n, c) thena[n] = cAoLiGei(a, n + 1)endendend
endAoLiGei({}, 1)
随后编写python代码,使用subprocess
包调用 LuaJIT 执行指定的 Lua 脚本,再添加一些错误处理功能来捕获任何可能出现的异常:
import subprocess
import os """
刚才编写的lua脚本保存名字为岛市老八.lua
subprocess.run(['luajit', '岛市老八.lua'], check=True) 可以直接运行
"""# 脚本路径
lua_script_path = './老八秘制小汉堡/岛市老八.lua' # 检查Lua脚本是否存在
if not os.path.exists(lua_script_path): print(f"Error: Lua script not found at {lua_script_path}")
else: try: # 使用subprocess调用LuaJIT执行Lua脚本 result = subprocess.run(['luajit', lua_script_path], check=True, capture_output=True, text=True) print("Lua script output:") print(result.stdout) except subprocess.CalledProcessError as e: # 如果LuaJIT执行失败,打印错误信息 print(f"Error executing Lua script: {e}") print(f"Lua script returned non-zero exit code: {e.returncode}") print(f"Lua script stderr output: {e.stderr}") except Exception as e: print(f"An unexpected error occurred: {e}")
简化一下:
import subprocess try: subprocess.run(['luajit', '岛市老八.lua'], check=True)
except FileNotFoundError as e: print("找不到文件或命令:", e)
except PermissionError as e: print("权限错误:", e)
except Exception as e: print("发生错误:", e)
输出正常。