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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:20:57