如何通过Python subprocess优雅地向Lua脚本传递多个输入?
Python调用Lua脚本传递多输入的优雅实现方案
问题背景
此前通过subprocess调用Lua脚本传递单个输入时运行正常,但传递多个输入时,communicate()的input参数仅接受字符串类型,手动拼接列表字符串的方案不够优雅,以下是几种更优的实现方式:
1. 按行分隔传递输入
利用Lua的io.read()默认按行读取的特性,在Python中将多个输入用换行符\n连接成字符串,Lua中依次读取每一行即可。
Python代码:
import subprocess as sp input_data = [5, 6] # 将每个输入转为字符串后用换行符拼接 input_str = "\n".join(map(str, input_data)) p = sp.Popen( ["lua-5.4.2\\lua54.exe", "test.lua"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, text=True ) result = p.communicate(input=input_str)[0] print(result)
Lua代码:
-- 依次读取每行输入,转为数字类型 local input_1 = tonumber(io.read()) local input_2 = tonumber(io.read()) local output = input_1 * input_2 print(output)
这种方式逻辑清晰,无需复杂的字符串处理,完全贴合io.read()的默认行为,是简单多输入场景的首选方案。
2. JSON序列化传递(适用于复杂数据结构)
如果需要传递嵌套列表、字典等复杂数据,推荐用JSON序列化统一传递,Lua端通过JSON库解析即可。
前置准备
先通过LuaRocks安装JSON库(如dkjson):
luarocks install dkjson
Python代码:
import subprocess as sp import json # 支持任意可序列化的复杂结构 input_data = {"num1": 5, "num2": 6, "extra": [1, 2, 3]} input_str = json.dumps(input_data) p = sp.Popen( ["lua-5.4.2\\lua54.exe", "test.lua"], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, text=True ) result = p.communicate(input=input_str)[0] print(result)
Lua代码:
local dkjson = require("dkjson") -- 读取所有输入内容(一次性读取整个JSON字符串) local input_str = io.read("*a") local input_data = dkjson.decode(input_str) local output = input_data.num1 * input_data.num2 print(output)
该方案扩展性极强,无需关心输入的数量和结构,统一序列化/反序列化即可,适合复杂场景。
3. 命令行参数传递(适用于简单参数)
如果输入是少量简单参数,可直接通过命令行参数传递给Lua脚本,Lua端通过全局的arg表获取参数。
Python代码:
import subprocess as sp input_data = [5, 6] # 将参数转为字符串后追加到命令行中 cmd = ["lua-5.4.2\\lua54.exe", "test.lua"] + list(map(str, input_data)) p = sp.Popen( cmd, stdout=sp.PIPE, stderr=sp.PIPE, text=True ) # 无需传递stdin,参数已通过命令行传入 result = p.communicate()[0] print(result)
Lua代码:
-- arg表中索引从1开始,对应命令行中脚本后的第一个参数 local input_1 = tonumber(arg[1]) local input_2 = tonumber(arg[2]) local output = input_1 * input_2 print(output)
这种方式无需处理标准输入流,逻辑直接,适合输入数量少、结构简单的场景。
内容的提问来源于stack exchange,提问作者Maxi H.
相关产品推荐
相关产品推荐

