PHP与Python间传递JSON时格式异常问题求助
问题分析与解决方案
你的核心问题是shell解析命令行参数时吃掉了JSON的双引号:当PHP将JSON直接拼入命令字符串时,shell会把双引号视为参数边界标记,解析后传递给Python的参数就丢失了引号结构。另外你的PHP代码还存在一个隐藏问题:$myHotel未实例化就直接赋值,会触发PHP错误,这可能也是你测试异常的原因之一。
以下是两种可靠的解决方法:
方案一:修复命令行参数传递(简单场景适用)
通过escapeshellarg()将JSON字符串包裹为单个shell参数,确保shell完整传递带引号的JSON。
修改后的PHP代码
<html> <body> <h1>Project</h1> <h2>Results</h2> </body> </html> <?php // 先实例化对象,避免未定义错误 $myHotel = new stdClass(); $myHotel->name = $_POST["NAME"]; $hotel_data = json_encode($myHotel); // 用escapeshellarg包裹JSON,确保shell将其作为单个完整参数 $command = "/var/www/html/test.py " . escapeshellarg($hotel_data); $resultAsString = exec($command); ?>
Python脚本(无需修改,直接读取参数)
#!/usr/bin/env python import sys import json # 现在能拿到完整带引号的JSON raw_data = sys.argv[1] parsed_data = json.loads(raw_data) # 处理后返回JSON(示例) print(json.dumps({"received_name": parsed_data["name"]}))
方案二:通过标准输入输出传递(推荐,适合复杂/大数据场景)
避开命令行参数的shell解析问题,直接通过stdin/stdout传递JSON数据,更安全可靠。
修改后的PHP代码
<html> <body> <h1>Project</h1> <h2>Results</h2> </body> </html> <?php $myHotel = new stdClass(); $myHotel->name = $_POST["NAME"]; $hotel_data = json_encode($myHotel); // 定义进程的输入输出管道 $descriptorspec = array( 0 => array("pipe", "r"), // 标准输入 1 => array("pipe", "w"), // 标准输出 2 => array("pipe", "w") // 错误输出(可选) ); $process = proc_open("/var/www/html/test.py", $descriptorspec, $pipes); if (is_resource($process)) { // 将JSON写入Python的标准输入 fwrite($pipes[0], $hotel_data); fclose($pipes[0]); // 读取Python返回的结果 $resultAsString = stream_get_contents($pipes[1]); fclose($pipes[1]); // 读取错误信息(调试用) $error_msg = stream_get_contents($pipes[2]); fclose($pipes[2]); // 关闭进程 proc_close($process); } ?>
修改后的Python脚本
#!/usr/bin/env python import sys import json # 从标准输入读取JSON数据 input_data = json.load(sys.stdin) # 处理数据(示例:转换为大写) processed_data = {"processed_name": input_data["name"].upper()} # 将结果输出到标准输出 print(json.dumps(processed_data))
内容的提问来源于stack exchange,提问作者Mauro Ghiglia
相关产品推荐
相关产品推荐

