You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:01:10