PHP向Python传递字符串数组时JSON交互失效,寻求解决方案
我尝试将PHP文件中的数据以JSON格式传递到Python文件,使用整数数组时一切正常,但改成字符串数组(注释第2行,取消注释第3行)后代码便无法正常运行,最终需要处理表单数据,但当前无法实现。
PHP代码
<?php $input = array(1,2,3); //$input = array('test', 'test'); $input = json_encode($input); $output = exec("form.py ". escapeshellarg($input)); var_dump($output); echo "<p>Output from Python: <br>" . $output . "<p>"; echo "Dump the output from Python as JSON<br>"; var_dump(json_decode($output)); $data = json_decode($output); echo "Accessing from JSON array:<br>"; foreach($data as $key=>$value) { echo "[" . $key . "] => " . $value . "<br>"; } ?>
Python代码
import sys import json output = [] output.append("Values submitted: " + str(sys.argv)) j = json.loads(sys.argv[1]) for k in j: output.append("Return from json: " + str(k)) print(json.dumps(output))
错误信息
string(0) ""
Output from Python:Dump the output from Python as JSON NULL
Accessing from JSON array:Warning: foreach() argument must be of type array|object, null given
in C:\xampp\htdocs\test\form_action.php on line 11
解决方案
1. 指定Python解释器执行脚本
Windows环境下直接执行.py文件可能存在关联问题,导致PHP无法正确捕获输出。修改PHP中的exec命令,明确指定Python解释器路径(若Python已加入系统环境变量,直接用python或python3即可):
$output = exec("python form.py ". escapeshellarg($input));
2. 捕获Python的错误输出
exec默认只捕获脚本的stdout输出,若Python脚本抛出错误(如JSON解析失败),错误信息会输出到stderr,无法被PHP获取。修改PHP代码,将stderr重定向到stdout,同时捕获所有输出行:
$command = "python form.py ". escapeshellarg($input) . " 2>&1"; exec($command, $output_lines, $return_code); $output = implode("\n", $output_lines); // 后续输出逻辑不变
这样就能看到Python脚本的具体错误,方便排查问题。
3. 修正PHP代码中的语法笔误
原代码第3行有多余空格://$ input,修正为//$input,避免潜在的语法问题。
4. 确保Python脚本的输出编码正确
在Windows环境下,Python的标准输出可能存在编码问题,导致JSON输出被截断或乱码。可以在Python的print语句中指定编码:
print(json.dumps(output).encode('utf-8').decode('utf-8'))
或者在脚本开头添加编码声明:
# -*- coding: utf-8 -*-
内容的提问来源于stack exchange,提问作者Shahroz

