使用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 = 8
function isplaceok(a, n, c)
for i = 1, n - 1 do
if (a[i] == c) or
(a[i] - i == c - n) or
(a[i] + i == c + n) then
return false
end
end
return true
end
function printsolution(a)
for i = 1, N do
for j = 1, N do
io.write(a[i] == j and "X" or "-", " ")
end
io.write("\n")
end
io.write("\n")
end
function AoLiGei(a, n)
if n > N then
printsolution(a)
else
for c = 1, N do
if isplaceok(a, n, c) then
a[n] = c
AoLiGei(a, n + 1)
end
end
end
end
AoLiGei({}, 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)
输出正常。