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

PHP调用Python脚本传数组参数、接收数组返回值实现问题

问题原因

你拿到整型返回值的核心原因是对PHPexec()函数的参数语义理解错误:

  • 函数第二个入参是引用传值,用来接收被调用脚本输出到标准输出的所有内容,会按输出行拆分为数组
  • 第三个入参也是引用传值,用来接收被调用脚本的进程退出状态码:脚本正常执行完成固定返回0,执行异常时返回非0整型值,你当前代码把这个状态码赋值给了$Splitmots,自然拿到的是整数。

另外你现有代码还有两个逻辑缺失:一是没有实际把$Alemme数组传递给Python脚本,二是Python脚本无法直接向PHP返回内存中的数组结构,必须通过标准输出传递序列化后的数据,PHP端再反序列化解析。

实现方案

跨语言传数组推荐用JSON作为序列化格式,兼容性最好,不需要额外安装依赖,具体实现分三步:

  • PHP端将待传递的数组编码为JSON字符串,做命令行参数转义后拼接到执行命令中
  • Python端接收到JSON字符串后解析为原生列表,完成业务处理后,将结果列表编码为JSON字符串打印到标准输出
  • PHP端接收到Python的标准输出内容后,解析JSON为原生PHP数组即可使用
代码示例

PHP端代码

$Alemme = explode(" ", $deleteUseless);
// 将数组转JSON,并用escapeshellarg处理特殊字符,避免空格、引号导致命令解析错误、命令注入风险
$jsonInput = escapeshellarg(json_encode($Alemme));
// 执行脚本,建议写python3的绝对路径,避免web运行环境找不到Python解释器
exec('/usr/bin/python3 /your/full/path/pythonFonctions.py ' . $jsonInput, $rawOutput, $exitCode);

// 先校验脚本执行状态
if ($exitCode !== 0) {
    throw new Exception("Python脚本执行失败,退出码:" . $exitCode);
}
// 拼接多行输出为完整字符串,解析为PHP数组
$resultJson = implode('', $rawOutput);
$Splitmots = json_decode($resultJson, true);

// 此时$Splitmots就是Python返回的数组,可直接使用

Python端代码(pythonFonctions.py)

import sys
import json

if __name__ == "__main__":
    # 读取命令行传入的JSON参数,解析为Python列表
    input_arr = json.loads(sys.argv[1])
    
    # 替换为你实际的业务处理逻辑
    processed_arr = [item.strip() for item in input_arr if item]
    
    # 处理结果编码为JSON输出,注意不要加其他print调试语句,否则会破坏JSON结构导致PHP解析失败
    print(json.dumps(processed_arr, ensure_ascii=False))
注意事项
  • Python解释器路径、Python脚本路径尽量写绝对路径,web服务器运行的环境变量和你命令行登录的环境变量不一致,写相对路径大概率会找不到文件
  • 如果传递的数组内容非常大,不要走命令行传参(系统对命令行长度有限制),可以改为PHP把JSON写入临时文件,Python读取临时文件的方式传参
  • Python脚本中除了最终输出JSON的print语句,不要加其他打印内容,否则会导致JSON格式损坏,PHP端解析失败
  • 如果你的Python脚本依赖第三方库,注意web运行用户的库路径配置,避免出现导入模块失败的问题

内容的提问来源于stack exchange,提问作者user60005003

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:33:24