如何将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
相关产品推荐
相关产品推荐

