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

如何将PHP数组对象传递给Python并转为可操作数组与DataFrame?

解决PHP传递JSON到Python后无法解析为可操作数组的问题

问题背景

使用Apache服务器、phpMyAdmin与Anaconda环境,PHP从$_SESSION['image']获取数组$dataraw,经json_encode转为JSON字符串$datagambar,通过shell_exec调用Python脚本并传递该字符串。但Python中用json.loads处理后,无法将其转为可操作的Python数组,进而无法生成pandas DataFrame,打印数据类型也未正常显示。

相关代码与输出

PHP代码

$dataraw = $_SESSION['image'];
$datagambar = json_encode($dataraw);

echo '<pre>';
print_r($dataraw);
echo '</pre>';

print($escaped_json);

$type1 = gettype($dataraw);
print($type1);

$type2 = gettype($datagambar);
print($type2);

$dataraw输出(类型为array)

Array
(
    [0] => Array
        (
            [FileName] => 20221227_202035.jpg
            [Model] => SM-A528B
            [Longitude] => 106.904251
            [Latitude] => -6.167665
        )

    [1] => Array
        (
            [FileName] => 20221227_202157.jpg
            [Model] => SM-A528B
            [Longitude] => 106.9042428
            [Latitude] => -6.1676580997222
        )

)

$datagambar输出(类型为string)

[{"FileName":"20221227_202035.jpg","Model":"SM-A528B","Longitude":106.904251,"Latitude":-6.167665},{"FileName":"20221227_202157.jpg","Model":"SM-A528B","Longitude":106.9042428,"Latitude":-6.167658099722223}]

Python调用代码(原问题代码)

echo shell_exec("D:\Anaconda\python.exe D:/xampp/htdocs/Klasifikasi_KNN/admin/test.py $datagambar");

Python脚本代码(原问题代码)

import sys, json
import os
import pymysql
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mplcursors as mpl
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score,hamming_loss,classification_report

json_list = []
escaped_json1 = sys.argv[1]

# this is working but its only a string of array json
# print(escaped_json1) 
# this is working but its only a string of array json

json_list.append(json.loads(escaped_json1))
parsed_data = json.loads(escaped_json1) 
print(json_list)
print(parsed_data)

Python输出(原问题输出)

Hello world has been called [{"FileName":"20221227_202035.jpg","Model":"SM-A528B","Longitude":106.904251,"Latitude":-6.167665},{"FileName":"20221227_202157.jpg","Model":"SM-A528B","Longitude":106.9042428,"Latitude":-6.167658099722223}]

问题原因

通过shell_exec传递JSON字符串时,shell会将字符串中的空格、引号等特殊字符当作参数分隔符,导致Python的sys.argv接收到的不是完整的JSON字符串,而是被拆分后的多个片段。此时json.loads无法正确解析不完整的JSON,自然无法生成可操作的数组。

解决步骤

1. 在PHP中对JSON字符串进行Shell转义

使用PHP的escapeshellarg()函数包裹JSON字符串,确保shell将其视为单个完整参数:

echo shell_exec("D:\Anaconda\python.exe D:/xampp/htdocs/Klasifikasi_KNN/admin/test.py " . escapeshellarg($datagambar));

2. 验证Python接收的参数完整性

在Python脚本开头添加参数打印,确认接收到完整的JSON:

import sys
print("Received arguments count:", len(sys.argv))
print("Full JSON string:", sys.argv[1])

3. 正确解析JSON并转为pandas DataFrame

修改Python脚本,添加错误处理,确保JSON解析成功后转为DataFrame:

import sys, json
import pandas as pd

def main():
    if len(sys.argv) < 2:
        print("Error: No JSON data provided")
        sys.exit(1)
    
    json_str = sys.argv[1]
    try:
        parsed_data = json.loads(json_str)
        print("Parsed data type:", type(parsed_data))
        
        # 转为pandas DataFrame
        df = pd.DataFrame(parsed_data)
        print("\nGenerated DataFrame:")
        print(df)
        
    except json.JSONDecodeError as e:
        print("JSON decode failed:", str(e))
        sys.exit(1)

if __name__ == "__main__":
    main()

验证结果

执行修改后的代码后,Python应能正确解析JSON为列表类型,成功生成pandas DataFrame并打印出数据结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:35:20